Skip to content

Commit abdc2ff

Browse files
committed
Set any setting value with config command
1 parent bed66e9 commit abdc2ff

File tree

3 files changed

+62
-3
lines changed

3 files changed

+62
-3
lines changed

common/src/main/kotlin/com/lambda/command/commands/ConfigCommand.kt

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,14 @@
1717

1818
package com.lambda.command.commands
1919

20+
import com.google.gson.JsonParser
21+
import com.lambda.brigadier.CommandResult
22+
import com.lambda.brigadier.CommandResult.Companion.failure
2023
import com.lambda.brigadier.CommandResult.Companion.success
2124
import com.lambda.brigadier.argument.literal
25+
import com.lambda.brigadier.argument.string
26+
import com.lambda.brigadier.argument.value
27+
import com.lambda.brigadier.argument.word
2228
import com.lambda.brigadier.executeWithResult
2329
import com.lambda.brigadier.required
2430
import com.lambda.command.LambdaCommand
@@ -28,8 +34,8 @@ import com.lambda.util.extension.CommandBuilder
2834

2935
object ConfigCommand : LambdaCommand(
3036
name = "config",
31-
aliases = setOf("cfg"),
32-
usage = "config <save | load>",
37+
aliases = setOf("cfg", "settings", "setting"),
38+
usage = "config <save | load | set> <configurable> <setting> <value>",
3339
description = "Save or load the configuration files"
3440
) {
3541
override fun CommandBuilder.create() {
@@ -51,5 +57,51 @@ object ConfigCommand : LambdaCommand(
5157
return@executeWithResult success()
5258
}
5359
}
60+
required(literal("set")) {
61+
required(string("configurable")) { config ->
62+
suggests { _, builder ->
63+
Configuration.configurables.forEach {
64+
builder.suggest("\"${it.name}\"")
65+
}
66+
builder.buildFuture()
67+
}
68+
required(string("setting")) { setting ->
69+
suggests { ctx, builder ->
70+
val conf = config(ctx).value()
71+
Configuration.configurableByName(conf)?.let { configurable ->
72+
configurable.settings.forEach {
73+
builder.suggest("\"${it.name}\"")
74+
}
75+
}
76+
builder.buildFuture()
77+
}
78+
required(string("value as JSON")) { value ->
79+
executeWithResult {
80+
val valueString = value().value()
81+
val confName = config().value()
82+
val settingName = setting().value()
83+
val conf = Configuration.configurableByName(confName) ?: run {
84+
return@executeWithResult failure("$confName is not a valid configurable.")
85+
}
86+
val set = Configuration.settingByName(conf, settingName) ?: run {
87+
return@executeWithResult failure("$settingName is not a valid setting for $confName.")
88+
}
89+
val parsed = try {
90+
JsonParser.parseString("\"$valueString\"")
91+
} catch (e: Exception) {
92+
return@executeWithResult failure("$valueString is not a valid JSON string.")
93+
}
94+
try {
95+
set.loadFromJson(parsed)
96+
} catch (e: Exception) {
97+
return@executeWithResult failure("Failed to load $valueString as a ${set.type::class.simpleName} for $settingName in $confName.")
98+
}
99+
this@ConfigCommand.info("Set $settingName to ${set.value} for $confName.")
100+
return@executeWithResult success()
101+
}
102+
}
103+
}
104+
}
105+
}
54106
}
55107
}

common/src/main/kotlin/com/lambda/config/AbstractSetting.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ import kotlin.reflect.KProperty
7272
*/
7373
abstract class AbstractSetting<T : Any>(
7474
private val defaultValue: T,
75-
protected val type: Type,
75+
val type: Type,
7676
val description: String,
7777
val visibility: () -> Boolean,
7878
) : Jsonable, Nameable {

common/src/main/kotlin/com/lambda/config/Configuration.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,5 +156,12 @@ abstract class Configuration : Jsonable {
156156

157157
companion object {
158158
val configurations = mutableSetOf<Configuration>()
159+
val configurables: Set<Configurable>
160+
get() = configurations.flatMapTo(mutableSetOf()) { it.configurables }
161+
162+
fun configurableByName(name: String) =
163+
configurables.find { it.name == name }
164+
fun settingByName(configurable: Configurable, name: String) =
165+
configurable.settings.find { it.name == name }
159166
}
160167
}

0 commit comments

Comments
 (0)