feat: 構造ノードの定義を可能に
This commit is contained in:
@@ -10,10 +10,11 @@ class MutablePermissionTree internal constructor(
|
||||
private val namespace: String,
|
||||
private val drafts: MutableMap<PermissionId, PermissionNodeDraft>
|
||||
) {
|
||||
fun node(id: String, block: MutableNode.() -> Unit = {}): MutableNode {
|
||||
fun node(id: String, registration: NodeRegistration, block: MutableNode.() -> Unit = {}): MutableNode {
|
||||
require(id.isNotBlank()) { "Node id must not be blank." }
|
||||
val permissionId = PermissionId.of("$namespace.${id.lowercase()}")
|
||||
val draft = drafts.getOrPut(permissionId) { PermissionNodeDraft(permissionId) }
|
||||
draft.registration = registration
|
||||
return MutableNode(permissionId, draft).apply(block)
|
||||
}
|
||||
|
||||
@@ -63,6 +64,12 @@ class MutablePermissionTree internal constructor(
|
||||
draft.wildcard = value
|
||||
}
|
||||
|
||||
var registration: NodeRegistration
|
||||
get() = draft.registration
|
||||
set(value) {
|
||||
draft.registration = value
|
||||
}
|
||||
|
||||
val tags: MutableSet<String>
|
||||
get() = draft.tags
|
||||
|
||||
@@ -83,11 +90,12 @@ class MutablePermissionTree internal constructor(
|
||||
draft.children[permissionId] = value
|
||||
}
|
||||
|
||||
fun node(id: String, block: MutableNode.() -> Unit = {}) {
|
||||
fun node(id: String, registration: NodeRegistration, block: MutableNode.() -> Unit = {}) {
|
||||
require(id.isNotBlank()) { "Node id must not be blank." }
|
||||
val permissionId = PermissionId.of("${this.id.value}.${id.lowercase()}")
|
||||
draft.children[permissionId] = true
|
||||
val childDraft = drafts.getOrPut(permissionId) { PermissionNodeDraft(permissionId) }
|
||||
childDraft.registration = registration
|
||||
MutableNode(permissionId, childDraft).apply(block)
|
||||
}
|
||||
|
||||
@@ -151,7 +159,8 @@ class MutablePermissionTree internal constructor(
|
||||
defaultValue = draft.defaultValue,
|
||||
children = draft.children.toMutableMap(),
|
||||
tags = draft.tags.toMutableSet(),
|
||||
wildcard = draft.wildcard
|
||||
wildcard = draft.wildcard,
|
||||
registration = draft.registration
|
||||
)
|
||||
drafts[newId] = newDraft
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package net.hareworks.permits_lib.domain
|
||||
|
||||
/**
|
||||
* Declares whether a DSL node should materialize as an actual Bukkit permission or behave as a
|
||||
* purely structural placeholder (still participates in relationships/wildcards).
|
||||
*/
|
||||
enum class NodeRegistration(val registersPermission: Boolean) {
|
||||
PERMISSION(true),
|
||||
STRUCTURAL(false)
|
||||
}
|
||||
@@ -14,7 +14,8 @@ data class PermissionNode(
|
||||
val defaultValue: PermissionDefault = PermissionDefault.FALSE,
|
||||
val children: Map<PermissionId, Boolean> = emptyMap(),
|
||||
val tags: Set<String> = emptySet(),
|
||||
val wildcard: Boolean = true
|
||||
val wildcard: Boolean = false,
|
||||
val registration: NodeRegistration = NodeRegistration.PERMISSION
|
||||
) {
|
||||
init {
|
||||
require(children.keys.none { it == id }) { "Permission node cannot be a child of itself." }
|
||||
|
||||
@@ -8,7 +8,8 @@ internal data class PermissionNodeDraft(
|
||||
var defaultValue: PermissionDefault = PermissionDefault.FALSE,
|
||||
val children: MutableMap<PermissionId, Boolean> = linkedMapOf(),
|
||||
val tags: MutableSet<String> = linkedSetOf(),
|
||||
var wildcard: Boolean = true
|
||||
var wildcard: Boolean = false,
|
||||
var registration: NodeRegistration = NodeRegistration.PERMISSION
|
||||
) {
|
||||
fun toNode(): PermissionNode =
|
||||
PermissionNode(
|
||||
@@ -17,7 +18,8 @@ internal data class PermissionNodeDraft(
|
||||
defaultValue = defaultValue,
|
||||
children = children.toMap(),
|
||||
tags = tags.toSet(),
|
||||
wildcard = wildcard
|
||||
wildcard = wildcard,
|
||||
registration = registration
|
||||
)
|
||||
|
||||
companion object {
|
||||
@@ -28,7 +30,8 @@ internal data class PermissionNodeDraft(
|
||||
defaultValue = node.defaultValue,
|
||||
children = node.children.toMutableMap(),
|
||||
tags = node.tags.toMutableSet(),
|
||||
wildcard = node.wildcard
|
||||
wildcard = node.wildcard,
|
||||
registration = node.registration
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,8 @@ class PermissionTree internal constructor(
|
||||
|
||||
operator fun get(id: PermissionId): PermissionNode? = nodes[id]
|
||||
|
||||
fun toSnapshot(): TreeSnapshot = TreeSnapshot(nodes)
|
||||
fun toSnapshot(): TreeSnapshot =
|
||||
TreeSnapshot(nodes.filterValues { it.registration.registersPermission })
|
||||
|
||||
companion object {
|
||||
fun empty(namespace: String): PermissionTree = PermissionTree(namespace, emptyMap())
|
||||
|
||||
@@ -29,6 +29,7 @@ class TreeSnapshot internal constructor(
|
||||
digest.update(tag.toByteArray())
|
||||
}
|
||||
digest.update(if (node.wildcard) 1 else 0)
|
||||
digest.update(node.registration.name.toByteArray())
|
||||
}
|
||||
return digest.digest().joinToString("") { "%02x".format(it) }
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package net.hareworks.permits_lib.dsl
|
||||
|
||||
import net.hareworks.permits_lib.domain.NodeRegistration
|
||||
import net.hareworks.permits_lib.domain.PermissionId
|
||||
import net.hareworks.permits_lib.domain.PermissionNodeDraft
|
||||
import org.bukkit.permissions.PermissionDefault
|
||||
@@ -27,6 +28,12 @@ class PermissionNodeBuilder internal constructor(
|
||||
draft.wildcard = value
|
||||
}
|
||||
|
||||
var registration: NodeRegistration
|
||||
get() = draft.registration
|
||||
set(value) {
|
||||
draft.registration = value
|
||||
}
|
||||
|
||||
fun tag(value: String) {
|
||||
if (value.isNotBlank()) {
|
||||
draft.tags += value.trim()
|
||||
@@ -52,12 +59,16 @@ class PermissionNodeBuilder internal constructor(
|
||||
* Declares a nested node whose id is derived from the current node:
|
||||
*
|
||||
* ```
|
||||
* node("command") {
|
||||
* node("reload") { ... } // -> namespace.command.reload
|
||||
* node("command", NodeRegistration.STRUCTURAL) {
|
||||
* node("reload", NodeRegistration.PERMISSION) { ... } // -> namespace.command.reload
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
fun node(id: String, block: PermissionNodeBuilder.() -> Unit = {}) {
|
||||
treeBuilder.nestedNode(draft, id, block)
|
||||
fun node(
|
||||
id: String,
|
||||
registration: NodeRegistration,
|
||||
block: PermissionNodeBuilder.() -> Unit = {}
|
||||
) {
|
||||
treeBuilder.nestedNode(draft, id, registration, block)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package net.hareworks.permits_lib.dsl
|
||||
|
||||
import net.hareworks.permits_lib.domain.NodeRegistration
|
||||
import net.hareworks.permits_lib.domain.PermissionId
|
||||
import net.hareworks.permits_lib.domain.PermissionNodeDraft
|
||||
import net.hareworks.permits_lib.domain.PermissionTree
|
||||
@@ -10,10 +11,15 @@ class PermissionTreeBuilder internal constructor(
|
||||
) {
|
||||
private val drafts = linkedMapOf<PermissionId, PermissionNodeDraft>()
|
||||
|
||||
fun node(id: String, block: PermissionNodeBuilder.() -> Unit = {}) {
|
||||
fun node(
|
||||
id: String,
|
||||
registration: NodeRegistration,
|
||||
block: PermissionNodeBuilder.() -> Unit = {}
|
||||
) {
|
||||
require(id.isNotBlank()) { "Node id must not be blank." }
|
||||
val permissionId = PermissionId.of("$namespace.${id.lowercase()}")
|
||||
val draft = drafts.getOrPut(permissionId) { PermissionNodeDraft(permissionId) }
|
||||
draft.registration = registration
|
||||
PermissionNodeBuilder(this, draft).apply(block)
|
||||
}
|
||||
|
||||
@@ -27,7 +33,7 @@ class PermissionTreeBuilder internal constructor(
|
||||
require(id.isNotBlank()) { "Child id must not be blank." }
|
||||
"${parent.id.value}.${id.lowercase()}"
|
||||
} else {
|
||||
id.lowercase()
|
||||
normalizeAbsolute(id)
|
||||
}
|
||||
val permissionId = PermissionId.of(target)
|
||||
parent.children[permissionId] = value
|
||||
@@ -48,17 +54,24 @@ class PermissionTreeBuilder internal constructor(
|
||||
internal fun nestedNode(
|
||||
parent: PermissionNodeDraft,
|
||||
id: String,
|
||||
registration: NodeRegistration,
|
||||
block: PermissionNodeBuilder.() -> Unit
|
||||
) {
|
||||
require(id.isNotBlank()) { "Nested node id must not be blank." }
|
||||
val composedId = PermissionId.of("${parent.id.value}.${id.lowercase()}")
|
||||
parent.children[composedId] = true
|
||||
val draft = drafts.getOrPut(composedId) { PermissionNodeDraft(composedId) }
|
||||
draft.registration = registration
|
||||
PermissionNodeBuilder(this, draft).apply(block)
|
||||
}
|
||||
|
||||
fun build(): PermissionTree =
|
||||
PermissionTree.from(namespace, drafts.mapValues { it.value.toNode() })
|
||||
|
||||
private fun normalizeAbsolute(id: String): String {
|
||||
require(id.isNotBlank()) { "Absolute permission id must not be blank." }
|
||||
return id.lowercase()
|
||||
}
|
||||
}
|
||||
|
||||
fun permissionTree(namespace: String, block: PermissionTreeBuilder.() -> Unit): PermissionTree =
|
||||
|
||||
Reference in New Issue
Block a user