All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.pi4j.ktx.Context.kt Maven / Gradle / Ivy

There is a newer version: 2.4.0
Show newest version
/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.pi4j.ktx

import com.pi4j.Pi4J
import com.pi4j.config.Config
import com.pi4j.context.Context
import com.pi4j.context.ContextBuilder
import com.pi4j.io.IO
import com.pi4j.platform.Platform
import com.pi4j.provider.Provider
import java.io.File
import java.io.InputStream
import java.io.Reader
import java.util.*

/**
 * @author Muhammad Hashim (mhashim6) (https://mhashim6.me) on 10/9/22
 */

@DslMarker
annotation class ContextBuilderMarker

@ContextBuilderMarker
 class KontextBuilder: ContextBuilder by ContextBuilder.newInstance() {
    operator fun Platform.unaryPlus() {
        add(this)
    }
    operator fun Provider, out IO<*, *, *>, out Config<*>>?.unaryPlus() {
        add(this)
    }

    operator fun Properties.unaryPlus() {
        add(this)
    }
    operator fun Pair.unaryPlus() {
        addProperty(this.first, this.second)
    }
    operator fun File.unaryPlus() {
        addProperties(this)
    }
    operator fun Reader.unaryPlus() {
        addProperties(this)
    }
    operator fun InputStream.unaryPlus() {
        addProperties(this)
    }
}

/**
 * Creates a new [Context] using [Pi4J.newAutoContext] and uses it in execution.
 * Automatically calls [Context.shutdown] after [block] execution
 * @param block runs on a [Context] Receiver
 */
inline fun pi4j(block: Context.() -> Unit): Context {
    val context = Pi4J.newAutoContext()
    context.run(block)
    context.shutdown()
    return context
}

inline fun buildContext(builder: KontextBuilder.() -> Unit): Context {
    return KontextBuilder().run {
        builder.invoke(this)
        build()
    }
}

inline fun  Context.hasPlatform() = hasPlatform(T::class.java)
inline fun > Context.hasProvider() = hasProvider(T::class.java)
inline fun > Context.provider(): T = provider(T::class.java)





© 2015 - 2024 Weber Informatics LLC | Privacy Policy