Fix Kotlin and Java interop issues. (#343)
The following PR fixes interop issues between Kotlin and Java. Currently, there is no way to go from `Command.Builder` -> `MutableCommandBuilder`, nor from `MutableCommandBuilder` -> `Command.Builder`. This PR fixes it by introducing - A new constructor for `MutableCommandBuilder`: ```kotlin public constructor(commandBuilder: Command.Builder<C>, commandManager: CommandManager<C>) ``` - Making the `commandBuilder` variable public - Adding the following extensions ```kotlin public fun <C : Any> Command.Builder<C>.toMutable(commandManager: CommandManager<C>): MutableCommandBuilder<C> public fun <C : Any> Command.Builder<C>.mutate(commandManager: CommandManager<C>, lambda: MutableCommandBuilder<C>.() -> Unit): MutableCommandBuilder<C> ```
This commit is contained in:
parent
fc27fa5b51
commit
7b23dd0329
2 changed files with 39 additions and 17 deletions
|
|
@ -39,11 +39,22 @@ import kotlin.reflect.KClass
|
||||||
* A mutable [Command.Builder] wrapper, providing functions to assist in creating commands using the
|
* A mutable [Command.Builder] wrapper, providing functions to assist in creating commands using the
|
||||||
* Kotlin builder DSL style
|
* Kotlin builder DSL style
|
||||||
*
|
*
|
||||||
|
* @property commandBuilder the command builder the mutate
|
||||||
|
* @property commandManager the command manager which will own this command
|
||||||
|
* @constructor Create a new [MutableCommandBuilder]
|
||||||
* @since 1.3.0
|
* @since 1.3.0
|
||||||
*/
|
*/
|
||||||
public class MutableCommandBuilder<C : Any> {
|
public class MutableCommandBuilder<C : Any>(
|
||||||
private val commandManager: CommandManager<C>
|
commandBuilder: Command.Builder<C>,
|
||||||
private var commandBuilder: Command.Builder<C>
|
private val commandManager: CommandManager<C>,
|
||||||
|
) {
|
||||||
|
/**
|
||||||
|
* The command builder that is being mutated by this [MutableCommandBuilder] instance.
|
||||||
|
*
|
||||||
|
* This is public so that this can be returned to a command builder for interop with java apis.
|
||||||
|
*/
|
||||||
|
public var commandBuilder: Command.Builder<C> = commandBuilder
|
||||||
|
private set
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new [MutableCommandBuilder]
|
* Create a new [MutableCommandBuilder]
|
||||||
|
|
@ -64,10 +75,7 @@ public class MutableCommandBuilder<C : Any> {
|
||||||
description: Description = Description.empty(),
|
description: Description = Description.empty(),
|
||||||
aliases: Array<String> = emptyArray(),
|
aliases: Array<String> = emptyArray(),
|
||||||
commandManager: CommandManager<C>
|
commandManager: CommandManager<C>
|
||||||
) {
|
) : this(commandManager.commandBuilder(name, description, *aliases), commandManager)
|
||||||
this.commandManager = commandManager
|
|
||||||
this.commandBuilder = commandManager.commandBuilder(name, description, *aliases)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new [MutableCommandBuilder]
|
* Create a new [MutableCommandBuilder]
|
||||||
|
|
@ -83,10 +91,7 @@ public class MutableCommandBuilder<C : Any> {
|
||||||
description: ArgumentDescription = ArgumentDescription.empty(),
|
description: ArgumentDescription = ArgumentDescription.empty(),
|
||||||
aliases: Array<String> = emptyArray(),
|
aliases: Array<String> = emptyArray(),
|
||||||
commandManager: CommandManager<C>
|
commandManager: CommandManager<C>
|
||||||
) {
|
) : this(commandManager.commandBuilder(name, description, *aliases), commandManager)
|
||||||
this.commandManager = commandManager
|
|
||||||
this.commandBuilder = commandManager.commandBuilder(name, description, *aliases)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new [MutableCommandBuilder] and invoke the provided receiver lambda on it
|
* Create a new [MutableCommandBuilder] and invoke the provided receiver lambda on it
|
||||||
|
|
@ -133,11 +138,6 @@ public class MutableCommandBuilder<C : Any> {
|
||||||
lambda(this)
|
lambda(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
private constructor(commandManager: CommandManager<C>, commandBuilder: Command.Builder<C>) {
|
|
||||||
this.commandManager = commandManager
|
|
||||||
this.commandBuilder = commandBuilder
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build a [Command] from the current state of this builder
|
* Build a [Command] from the current state of this builder
|
||||||
*
|
*
|
||||||
|
|
@ -184,7 +184,7 @@ public class MutableCommandBuilder<C : Any> {
|
||||||
* @since 1.3.0
|
* @since 1.3.0
|
||||||
*/
|
*/
|
||||||
public fun copy(): MutableCommandBuilder<C> =
|
public fun copy(): MutableCommandBuilder<C> =
|
||||||
MutableCommandBuilder(this.commandManager, this.commandBuilder)
|
MutableCommandBuilder(this.commandBuilder, this.commandManager)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make a new copy of this [MutableCommandBuilder] and invoke the provided receiver lambda on it
|
* Make a new copy of this [MutableCommandBuilder] and invoke the provided receiver lambda on it
|
||||||
|
|
|
||||||
|
|
@ -129,6 +129,28 @@ public fun <C : Any> CommandManager<C>.command(
|
||||||
public fun <C : Any> Command.Builder<C>.senderType(type: KClass<out C>): Command.Builder<C> =
|
public fun <C : Any> Command.Builder<C>.senderType(type: KClass<out C>): Command.Builder<C> =
|
||||||
senderType(type.java)
|
senderType(type.java)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new [MutableCommandBuilder].
|
||||||
|
*
|
||||||
|
* @param commandManager the command manager, which will own this command.
|
||||||
|
* @since 1.7.0
|
||||||
|
*/
|
||||||
|
public fun <C : Any> Command.Builder<C>.toMutable(
|
||||||
|
commandManager: CommandManager<C>
|
||||||
|
): MutableCommandBuilder<C> = MutableCommandBuilder(this, commandManager)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new [MutableCommandBuilder] and invoke the provided receiver lambda on it.
|
||||||
|
*
|
||||||
|
* @param commandManager the command manager, which will own this command.
|
||||||
|
* @param lambda receiver lambda, which will be invoked on the new builder.
|
||||||
|
* @since 1.7.0
|
||||||
|
*/
|
||||||
|
public fun <C : Any> Command.Builder<C>.mutate(
|
||||||
|
commandManager: CommandManager<C>,
|
||||||
|
lambda: MutableCommandBuilder<C>.() -> Unit
|
||||||
|
): MutableCommandBuilder<C> = MutableCommandBuilder(this, commandManager).also(lambda)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a [Description], defaulting to [Description.empty]
|
* Get a [Description], defaulting to [Description.empty]
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue