package dev.isxander.yacl3.config.v3 import com.mojang.serialization.Codec import dev.isxander.yacl3.dsl.OptionDsl import dev.isxander.yacl3.dsl.OptionRegistrar import org.jetbrains.annotations.ApiStatus import kotlin.properties.PropertyDelegateProvider import kotlin.properties.ReadOnlyProperty import kotlin.reflect.KProperty @ApiStatus.Experimental fun EntryAddable.register( default: T, codec: Codec ) = PropertyDelegateProvider>> { thisRef, property -> val entry = thisRef.register(property.name, default, codec) ReadOnlyProperty { _, _ -> entry } } fun > EntryAddable.register( fieldName: String? = null, configInstance: T ) = PropertyDelegateProvider { thisRef, property -> thisRef.register(fieldName ?: property.name, configInstance) configInstance } operator fun > T.getValue(thisRef: CodecConfig<*>?, property: KProperty<*>): T { return this } @get:ApiStatus.Experimental @set:ApiStatus.Experimental var ConfigEntry.value: T get() = this.get() set(value) = this.set(value) @get:ApiStatus.Experimental val ConfigEntry.default: T get() = this.defaultValue() @get:ApiStatus.Experimental val ConfigEntry<*>.fieldName: String get() = this.fieldName() @ApiStatus.Experimental fun OptionRegistrar.register( configEntry: ConfigEntry, block: OptionDsl.() -> Unit ) = register(configEntry.fieldName) { binding(configEntry.asBinding()) block() }