diff --git a/branch-adventure/branch-adventure.iml b/branch-adventure/branch-adventure.iml
new file mode 100644
index 0000000..641ad76
--- /dev/null
+++ b/branch-adventure/branch-adventure.iml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/branch-adventure/pom.xml b/branch-adventure/pom.xml
new file mode 100644
index 0000000..30bef17
--- /dev/null
+++ b/branch-adventure/pom.xml
@@ -0,0 +1,36 @@
+
+
+
+ branch
+ xyz.auriium
+ 0.1.0
+
+ 4.0.0
+
+ branch-spigot-adventure
+
+
+ ${compiler.version}
+ ${compiler.version}
+
+
+
+
+ xyz.auriium
+ branch-core
+
+
+ net.kyori
+ adventure-api
+ 4.8.1
+
+
+ net.kyori
+ adventure-text-serializer-legacy
+ 4.8.1
+
+
+
+
\ No newline at end of file
diff --git a/branch-adventure/src/main/java/xyz/auriium/branch/adventure/AdventureMessageBoss.java b/branch-adventure/src/main/java/xyz/auriium/branch/adventure/AdventureMessageBoss.java
new file mode 100644
index 0000000..bd1c8dd
--- /dev/null
+++ b/branch-adventure/src/main/java/xyz/auriium/branch/adventure/AdventureMessageBoss.java
@@ -0,0 +1,12 @@
+package xyz.auriium.branch.adventure;
+
+import net.kyori.adventure.text.Component;
+import xyz.auriium.branch.interfacing.MessageWorker;
+import xyz.auriium.branch.interfacing.WorkerMessageBoss;
+
+public class AdventureMessageBoss extends WorkerMessageBoss {
+
+ public AdventureMessageBoss(AudienceTransmogrifier iTransmogrifier, AudienceTransmogrifier aTransmogrifier) {
+ super(new AdventureMessageWorker<>(iTransmogrifier), new AdventureMessageWorker<>(aTransmogrifier));
+ }
+}
diff --git a/branch-adventure/src/main/java/xyz/auriium/branch/adventure/AdventureMessageWorker.java b/branch-adventure/src/main/java/xyz/auriium/branch/adventure/AdventureMessageWorker.java
new file mode 100644
index 0000000..2716206
--- /dev/null
+++ b/branch-adventure/src/main/java/xyz/auriium/branch/adventure/AdventureMessageWorker.java
@@ -0,0 +1,25 @@
+package xyz.auriium.branch.adventure;
+
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.TextComponent;
+import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
+import xyz.auriium.branch.interfacing.MessageWorker;
+
+public class AdventureMessageWorker implements MessageWorker {
+
+ private final AudienceTransmogrifier transmogrifier;
+
+ public AdventureMessageWorker(AudienceTransmogrifier transmogrifier) {
+ this.transmogrifier = transmogrifier;
+ }
+
+ @Override
+ public void sendMessage(String message, T type) {
+ transmogrifier.transmogrify(type).sendMessage(LegacyComponentSerializer.legacyAmpersand().deserialize(message));
+ }
+
+ @Override
+ public void sendObject(Component message, T type) {
+ transmogrifier.transmogrify(type).sendMessage(message);
+ }
+}
diff --git a/branch-adventure/src/main/java/xyz/auriium/branch/adventure/AudienceTransmogrifier.java b/branch-adventure/src/main/java/xyz/auriium/branch/adventure/AudienceTransmogrifier.java
new file mode 100644
index 0000000..3f89906
--- /dev/null
+++ b/branch-adventure/src/main/java/xyz/auriium/branch/adventure/AudienceTransmogrifier.java
@@ -0,0 +1,12 @@
+package xyz.auriium.branch.adventure;
+
+import net.kyori.adventure.audience.Audience;
+
+/**
+ * I am not one to be outdone with names
+ */
+public interface AudienceTransmogrifier {
+
+ Audience transmogrify(A user);
+
+}
diff --git a/core/pom.xml b/branch-core/pom.xml
similarity index 75%
rename from core/pom.xml
rename to branch-core/pom.xml
index b7479b7..8a4fb06 100644
--- a/core/pom.xml
+++ b/branch-core/pom.xml
@@ -25,7 +25,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
branch
- me.aurium
+ xyz.auriium
0.1.0
4.0.0
@@ -37,6 +37,24 @@
${compiler.version}
+
+
+ org.slf4j
+ slf4j-api
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-params
+ test
+
+
+
@@ -51,6 +69,4 @@
-
-
\ No newline at end of file
diff --git a/branch-core/src/main/java/module-info.java b/branch-core/src/main/java/module-info.java
new file mode 100644
index 0000000..a9fa6ec
--- /dev/null
+++ b/branch-core/src/main/java/module-info.java
@@ -0,0 +1,26 @@
+module branch.core {
+ exports xyz.auriium.branch;
+ exports xyz.auriium.branch.base;
+ exports xyz.auriium.branch.base.execution;
+ exports xyz.auriium.branch.base.execution.blocks;
+ exports xyz.auriium.branch.base.permissions;
+ exports xyz.auriium.branch.base.suggestion;
+ exports xyz.auriium.branch.nodes;
+ exports xyz.auriium.branch.nodes.argument;
+ exports xyz.auriium.branch.nodes.argument.model;
+ exports xyz.auriium.branch.nodes.argument.impl;
+ exports xyz.auriium.branch.nodes.argument.types;
+ exports xyz.auriium.branch.results;
+ exports xyz.auriium.branch.nodes.branching;
+ exports xyz.auriium.branch.nodes.description;
+ exports xyz.auriium.branch.nodes.single;
+ exports xyz.auriium.branch.nodes.single.impl;
+ exports xyz.auriium.branch.nodes.help;
+ exports xyz.auriium.branch.nodes.proxy;
+ exports xyz.auriium.branch.interfacing;
+ exports xyz.auriium.branch.interfacing.exceptional;
+ exports xyz.auriium.branch.interfacing.exceptional.anomalies;
+ exports xyz.auriium.branch.interfacing.exceptional.caption;
+ exports xyz.auriium.branch.interfacing.exceptional.printing;
+ exports xyz.auriium.branch.typeadapter;
+}
\ No newline at end of file
diff --git a/core/src/main/java/me/aurium/branch/centralized/CentralizedManager.java b/branch-core/src/main/java/xyz/auriium/branch/CentralizedManager.java
similarity index 68%
rename from core/src/main/java/me/aurium/branch/centralized/CentralizedManager.java
rename to branch-core/src/main/java/xyz/auriium/branch/CentralizedManager.java
index cac406a..18aa04d 100644
--- a/core/src/main/java/me/aurium/branch/centralized/CentralizedManager.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/CentralizedManager.java
@@ -19,11 +19,12 @@
*
*/
-package me.aurium.branch.centralized;
+package xyz.auriium.branch;
-import me.aurium.branch.centralized.base.NodeBase;
-import me.aurium.branch.centralized.base.NodeBaseBuilder;
-import me.aurium.branch.centralized.typeadapter.ManagerAdapter;
+import xyz.auriium.branch.base.NodeBase;
+import xyz.auriium.branch.base.NodeBaseBuilder;
+import xyz.auriium.branch.typeadapter.ManagerAdapter;
+import xyz.auriium.branch.nodes.CommandNode;
/**
* Represents the utmost base part of the command framework which has the ability to bind any injected commands to a platform
@@ -35,10 +36,13 @@ public interface CentralizedManager {
CentralizedManagerBinder getBinder(V platform);
NodeSource getSource();
- NodeBaseBuilder newCommand();
- NodeBaseBuilder newCommand(ManagerAdapter adapter);
+ NodeBaseBuilder newCommandWithBuilder();
+ NodeBaseBuilder newCommandWithBuilder(ManagerAdapter adapter);
- void injectCommand(NodeBase base);
+ void newCommandWithNode(CommandNode node);
+ void newCommandWithNode(CommandNode node, ManagerAdapter adapter);
+
+ void newCommand(NodeBase base);
}
diff --git a/core/src/main/java/me/aurium/branch/centralized/CentralizedManagerBinder.java b/branch-core/src/main/java/xyz/auriium/branch/CentralizedManagerBinder.java
similarity index 96%
rename from core/src/main/java/me/aurium/branch/centralized/CentralizedManagerBinder.java
rename to branch-core/src/main/java/xyz/auriium/branch/CentralizedManagerBinder.java
index 2c16ed7..066cbf6 100644
--- a/core/src/main/java/me/aurium/branch/centralized/CentralizedManagerBinder.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/CentralizedManagerBinder.java
@@ -19,7 +19,7 @@
*
*/
-package me.aurium.branch.centralized;
+package xyz.auriium.branch;
/**
* Represents a carrier vessel which is typically attached to the instance of a centralizedManagerBinder's platform
diff --git a/branch-core/src/main/java/xyz/auriium/branch/NodeSource.java b/branch-core/src/main/java/xyz/auriium/branch/NodeSource.java
new file mode 100644
index 0000000..62179b3
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/NodeSource.java
@@ -0,0 +1,20 @@
+package xyz.auriium.branch;
+
+import xyz.auriium.branch.base.execution.ExecutionHandler;
+import xyz.auriium.branch.base.permissions.Permission;
+import xyz.auriium.branch.nodes.description.Description;
+import xyz.auriium.branch.nodes.branching.BranchingBuilder;
+import xyz.auriium.branch.nodes.single.SingleNode;
+import xyz.auriium.branch.nodes.single.SingleNodeBuilder;
+
+public interface NodeSource {
+
+ SingleNodeBuilder single();
+ BranchingBuilder branch();
+ //TODO argument
+
+
+ SingleNode singleNode(String literal, ExecutionHandler handler);
+ SingleNode singleNode(String literal, ExecutionHandler handler, Permission permission, Description description);
+
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/AbstractNodeBase.java b/branch-core/src/main/java/xyz/auriium/branch/base/AbstractNodeBase.java
new file mode 100644
index 0000000..1897230
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/AbstractNodeBase.java
@@ -0,0 +1,148 @@
+/*
+ *
+ * Branch
+ * Copyright © 2021 Aurium
+ *
+ * Branch is free software: you can redistribute it and/or modify
+ * It under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * Branch is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Branch. If not, see
+ * and navigate to version 3 of the GNU Affero General Public License.
+ *
+ */
+
+package xyz.auriium.branch.base;
+
+import xyz.auriium.branch.base.suggestion.Suggestion;
+import xyz.auriium.branch.base.suggestion.SuggestionSearchStrategy;
+import xyz.auriium.branch.typeadapter.ManagerAdapter;
+import xyz.auriium.branch.base.execution.Execution;
+import xyz.auriium.branch.base.execution.ExecutionSearchStrategy;
+import xyz.auriium.branch.interfacing.exceptional.AnomalyHandler;
+import xyz.auriium.branch.nodes.CommandNode;
+import xyz.auriium.branch.results.PreProcessSearch;
+import xyz.auriium.branch.results.SearcherEquality;
+import xyz.auriium.branch.results.Result;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents a node base that has the ability to convert it's input sender to a sender of type C or fail with a result.
+ * @param the input type of nodebase
+ * @param the adjusted type desired by the output of the {@link ManagerAdapter} found in this nodebase
+ */
+public abstract class AbstractNodeBase implements NodeBase {
+
+ private final ManagerAdapter adapter;
+ private final AnomalyHandler handler;
+
+ private final CommandNode baseNode;
+ private final ExecutionSearchStrategy executionStrategy;
+ private final SuggestionSearchStrategy suggestionStrategy;
+ private final ContextProvider provider;
+ private final SearcherEquality equality;
+
+ private final static List EMPTY = new ArrayList<>();
+
+ protected AbstractNodeBase(ManagerAdapter adapter, AnomalyHandler handler, CommandNode baseNode, ExecutionSearchStrategy executionStrategy, SuggestionSearchStrategy suggestionStrategy, ContextProvider provider, SearcherEquality equality) {
+ this.adapter = adapter;
+ this.handler = handler;
+ this.baseNode = baseNode;
+ this.executionStrategy = executionStrategy;
+ this.suggestionStrategy = suggestionStrategy;
+ this.provider = provider;
+ this.equality = equality;
+ }
+
+
+ /**
+ * Method for execution of runnable once runnable is found
+ * Exists in order to allow for concurrent-type nodebases
+ *
+ * @param execution the runnable
+ */
+ abstract void submitExecution(Execution execution);
+
+ public void execute(I input, String alias, String[] args) {
+ //have not aqcuired C-type (cannot use Result object or message handling-parsing)
+
+ if (!adapter.canAdapt(input)) {
+ handler.communicateNotAdapted(input, adapter.failedParseResponse(input));
+
+ return;
+ }
+
+ //have acquired C-type via parsing.
+
+ A adaptedSender = adapter.adapt(input);
+ NodeContext produced = provider.produce(adaptedSender, alias, args);
+
+ Result> preprocessResult = executionStrategy.attemptPreprocess(produced, equality, baseNode);
+
+ if (!preprocessResult.isSuccessful()) {
+ handler.communicateAdapted(adaptedSender, preprocessResult.getFailure());
+
+ return;
+ }
+
+ PreProcessSearch info = preprocessResult.getSuccess();
+
+ Result> executionResult = info.getFoundNode().searchExecute(produced, info);
+
+ if (!executionResult.isSuccessful()) {
+ handler.communicateAdapted(adaptedSender, preprocessResult.getFailure());
+
+ return;
+ }
+
+ submitExecution(executionResult.getSuccess());
+ }
+
+ public List suggest(I input, String alias, String[] args) {
+
+ if (!adapter.canAdapt(input)) {
+ handler.communicateNotAdapted(input, adapter.failedParseResponse(input));
+
+ return EMPTY;
+ }
+
+ //have acquired C-type via parsing.
+
+ A adaptedSender = adapter.adapt(input);
+ NodeContext produced = provider.produce(adaptedSender, alias, args);
+
+ Result> preprocessResult = executionStrategy.attemptPreprocess(produced, equality, baseNode);
+
+ if (!preprocessResult.isSuccessful()) {
+ handler.communicateAdapted(adaptedSender, preprocessResult.getFailure());
+
+ return EMPTY;
+ }
+
+ PreProcessSearch info = preprocessResult.getSuccess();
+
+ var searchResult = info.getFoundNode().searchSuggestion(produced, info);
+
+ if (!searchResult.isSuccessful()) {
+ handler.communicateAdapted(adaptedSender, searchResult.getFailure());
+
+ return EMPTY;
+ }
+
+ List> suggestions = searchResult.getSuccess();
+
+ return suggestionStrategy.order(suggestions,produced);
+ }
+
+
+
+}
diff --git a/core/src/main/java/me/aurium/branch/execution/ContextProvider.java b/branch-core/src/main/java/xyz/auriium/branch/base/ContextProvider.java
similarity index 84%
rename from core/src/main/java/me/aurium/branch/execution/ContextProvider.java
rename to branch-core/src/main/java/xyz/auriium/branch/base/ContextProvider.java
index 4c6056d..2860f0f 100644
--- a/core/src/main/java/me/aurium/branch/execution/ContextProvider.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/ContextProvider.java
@@ -19,16 +19,13 @@
*
*/
-package me.aurium.branch.execution;
-
-import me.aurium.branch.nodes.CommandNode;
-import me.aurium.branch.nodes.results.SearchInfo;
+package xyz.auriium.branch.base;
/**
* Represents something that produces specific context based on a platform
*/
public interface ContextProvider {
- NodeContext produce(T sender, String alias, String[] strings, CommandNode baseNode, SearchInfo search);
+ NodeContext produce(T sender, String alias, String[] strings);
}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/DelegatingEnhancedContext.java b/branch-core/src/main/java/xyz/auriium/branch/base/DelegatingEnhancedContext.java
new file mode 100644
index 0000000..1bcd9aa
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/DelegatingEnhancedContext.java
@@ -0,0 +1,39 @@
+package xyz.auriium.branch.base;
+
+import xyz.auriium.branch.results.PostProcessSearch;
+
+public class DelegatingEnhancedContext implements EnhancedNodeContext {
+
+ private final NodeContext delegate;
+ private final PostProcessSearch search;
+
+ public DelegatingEnhancedContext(NodeContext delegate, PostProcessSearch search) {
+ this.delegate = delegate;
+ this.search = search;
+ }
+
+ @Override
+ public T getSender() {
+ return delegate.getSender();
+ }
+
+ @Override
+ public String getAlias() {
+ return delegate.getAlias();
+ }
+
+ @Override
+ public String[] getArgs() {
+ return delegate.getArgs();
+ }
+
+ @Override
+ public boolean hasStringPermissible(String string) {
+ return delegate.hasStringPermissible(string);
+ }
+
+ @Override
+ public PostProcessSearch getProcessedSearch() {
+ return search;
+ }
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/DelegatingNodeBase.java b/branch-core/src/main/java/xyz/auriium/branch/base/DelegatingNodeBase.java
new file mode 100644
index 0000000..4de9947
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/DelegatingNodeBase.java
@@ -0,0 +1,33 @@
+package xyz.auriium.branch.base;
+
+import xyz.auriium.branch.base.suggestion.SuggestionSearchStrategy;
+import xyz.auriium.branch.nodes.CommandNode;
+import xyz.auriium.branch.typeadapter.ManagerAdapter;
+import xyz.auriium.branch.base.execution.ExecutionSearchStrategy;
+import xyz.auriium.branch.nodes.description.Description;
+import xyz.auriium.branch.interfacing.exceptional.AnomalyHandler;
+import xyz.auriium.branch.nodes.IdentifiableNode;
+import xyz.auriium.branch.results.SearcherEquality;
+
+/**
+ * Adapting node base that delegates identifier calls to the first node in the base stack.
+ */
+public class DelegatingNodeBase extends RunNodeBase {
+
+ private final IdentifiableNode baseNode;
+
+ public DelegatingNodeBase(ManagerAdapter adapter, AnomalyHandler handler, IdentifiableNode baseNode, ExecutionSearchStrategy executionStrategy, SuggestionSearchStrategy suggestionStrategy, ContextProvider provider, SearcherEquality equality) {
+ super(adapter, handler, baseNode, executionStrategy, suggestionStrategy, provider, equality);
+ this.baseNode = baseNode;
+ }
+
+ @Override
+ public Description getDescription() {
+ return baseNode.getDescription();
+ }
+
+ @Override
+ public String getIdentifier() {
+ return baseNode.getIdentifier().getLabel();
+ }
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/EnhancedNodeContext.java b/branch-core/src/main/java/xyz/auriium/branch/base/EnhancedNodeContext.java
new file mode 100644
index 0000000..69be2ef
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/EnhancedNodeContext.java
@@ -0,0 +1,9 @@
+package xyz.auriium.branch.base;
+
+import xyz.auriium.branch.results.PostProcessSearch;
+
+public interface EnhancedNodeContext extends NodeContext {
+
+ PostProcessSearch getProcessedSearch();
+
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/NodeBase.java b/branch-core/src/main/java/xyz/auriium/branch/base/NodeBase.java
new file mode 100644
index 0000000..e912ec0
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/NodeBase.java
@@ -0,0 +1,61 @@
+/*
+ *
+ * Branch
+ * Copyright © 2021 Aurium
+ *
+ * Branch is free software: you can redistribute it and/or modify
+ * It under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * Branch is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Branch. If not, see
+ * and navigate to version 3 of the GNU Affero General Public License.
+ *
+ */
+
+package xyz.auriium.branch.base;
+
+import xyz.auriium.branch.nodes.description.Description;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Represents a single command tree as a single executable object, executable by the bound node base.
+ * You can **technically** simply implement this and pretend it's a normal bukkit command
+ * I will laugh at you, however.
+ *
+ * @param type of input object used by the manager this node base is bound to
+ */
+public interface NodeBase {
+
+ /**
+ * Method called when node base desires execution of this object
+ * @param input input object of the manager (maybe not final adapted object)
+ * @param alias alias of the command (people like using this in interfacing)
+ * @param args arguments sent by input object
+ */
+ void execute(I input, String alias, String[] args);
+
+ /**
+ * Method called when node base desires suggestions to submit to the user
+ * @param input input object of the manager (maybe not final adapted object)
+ * @param alias alias of the command (people like using this in interfacing)
+ * @param args arguments sent by input object
+ */
+ List suggest(I input, String alias, String[] args);
+
+ Description getDescription();
+ String getIdentifier();
+
+ default List getAliases() {
+ return Collections.emptyList();
+ }
+
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/NodeBaseBuilder.java b/branch-core/src/main/java/xyz/auriium/branch/base/NodeBaseBuilder.java
new file mode 100644
index 0000000..8621f72
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/NodeBaseBuilder.java
@@ -0,0 +1,100 @@
+/*
+ *
+ * Branch
+ * Copyright © 2021 Aurium
+ *
+ * Branch is free software: you can redistribute it and/or modify
+ * It under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * Branch is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Branch. If not, see
+ * and navigate to version 3 of the GNU Affero General Public License.
+ *
+ */
+
+package xyz.auriium.branch.base;
+
+import xyz.auriium.branch.CentralizedManager;
+import xyz.auriium.branch.typeadapter.ManagerAdapter;
+import xyz.auriium.branch.base.execution.ExecutionSearchStrategy;
+import xyz.auriium.branch.interfacing.exceptional.AnomalyHandler;
+import xyz.auriium.branch.nodes.IdentifiableNode;
+import xyz.auriium.branch.results.SearcherEquality;
+
+import java.util.*;
+
+/**
+ * Default implementation of a class that produces adaptingNodeBases
+ *
+ * @param Input type
+ * @param Adapted type
+ */
+public class NodeBaseBuilder {
+
+ private final CentralizedManager manager;
+
+ private final ManagerAdapter adapter;
+ private AnomalyHandler handler;
+
+ private IdentifiableNode node;
+ private ExecutionSearchStrategy strategy;
+ private ContextProvider provider;
+ private SearcherEquality equality;
+
+ public NodeBaseBuilder(CentralizedManager manager, ManagerAdapter adapter) {
+ this.manager = manager;
+ this.adapter = adapter;
+ }
+
+ public NodeBaseBuilder(CentralizedManager manager, ManagerAdapter adapter, ExecutionSearchStrategy strategy, ContextProvider provider, AnomalyHandler handler, SearcherEquality equality) {
+ this.manager = manager;
+ this.adapter = adapter;
+ this.strategy = strategy;
+ this.provider = provider;
+ this.handler = handler;
+ this.equality = equality;
+ }
+
+ public NodeBaseBuilder withNode(IdentifiableNode node) {
+ this.node = node;
+
+ return this;
+ }
+
+ public NodeBaseBuilder customStrategy(ExecutionSearchStrategy strategy) {
+ this.strategy = strategy;
+
+ return this;
+ }
+
+ public NodeBaseBuilder customProvider(ContextProvider provider) {
+ this.provider = provider;
+
+ return this;
+ }
+
+ public NodeBaseBuilder customInterfacing(AnomalyHandler handler) {
+ this.handler = handler;
+
+ return this;
+ }
+
+
+
+ public void finish() {
+ Objects.requireNonNull(node, "Node cannot be null!");
+ Objects.requireNonNull(strategy, "Strategy cannot be null!");
+ Objects.requireNonNull(provider, "Provider cannot be null!");
+ Objects.requireNonNull(handler, "AnomalyHandler cannot be null!");
+ Objects.requireNonNull(equality, "SearcherEquality cannot be null!");
+
+ manager.newCommand(new DelegatingNodeBase<>(adapter,handler,node,strategy,provider,equality));
+ }
+}
diff --git a/core/src/main/java/me/aurium/branch/execution/NodeContext.java b/branch-core/src/main/java/xyz/auriium/branch/base/NodeContext.java
similarity index 67%
rename from core/src/main/java/me/aurium/branch/execution/NodeContext.java
rename to branch-core/src/main/java/xyz/auriium/branch/base/NodeContext.java
index 467e7df..6058a55 100644
--- a/core/src/main/java/me/aurium/branch/execution/NodeContext.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/NodeContext.java
@@ -19,11 +19,7 @@
*
*/
-package me.aurium.branch.execution;
-
-import me.aurium.branch.interfacing.Response;
-import me.aurium.branch.nodes.CommandNode;
-import me.aurium.branch.nodes.results.SearchInfo;
+package xyz.auriium.branch.base;
/**
@@ -33,23 +29,25 @@
*/
public interface NodeContext {
+ /**
+ * Gets the parsed sender object used by this object
+ * @return the sender object
+ */
T getSender();
- String getAlias();
- String[] getArgs();
- CommandNode getBaseExecutedNode();
- SearchInfo getResults();
/**
- * Sends an ugly string to the player using the platform's message handler. Whatever floats your boat!
- * @param string string
+ * Returns the specific name used to execute this command
+ * @return alias string
*/
- void stringSender(String string);
+ String getAlias();
+ String[] getArgs();
/**
- * Sends a formatted response to a player coded to a key
- * @param failure the response
+ * Gets whether the context's delegating sender has access to a permission. On some platforms, this may always be false.
+ * @param string the permission
+ * @return whether it is permissible or not.
*/
- void response(Response failure);
+ boolean hasStringPermissible(String string);
}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/RunNodeBase.java b/branch-core/src/main/java/xyz/auriium/branch/base/RunNodeBase.java
new file mode 100644
index 0000000..253f23f
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/RunNodeBase.java
@@ -0,0 +1,26 @@
+package xyz.auriium.branch.base;
+
+import xyz.auriium.branch.base.suggestion.SuggestionSearchStrategy;
+import xyz.auriium.branch.typeadapter.ManagerAdapter;
+import xyz.auriium.branch.base.execution.Execution;
+import xyz.auriium.branch.base.execution.ExecutionSearchStrategy;
+import xyz.auriium.branch.interfacing.exceptional.AnomalyHandler;
+import xyz.auriium.branch.nodes.CommandNode;
+import xyz.auriium.branch.results.SearcherEquality;
+
+/**
+ * Nodebase that simply runs the execution runnable
+ * @param input type
+ * @param adapted type
+ */
+public abstract class RunNodeBase extends AbstractNodeBase {
+
+ protected RunNodeBase(ManagerAdapter adapter, AnomalyHandler handler, CommandNode baseNode, ExecutionSearchStrategy executionStrategy, SuggestionSearchStrategy suggestionStrategy, ContextProvider provider, SearcherEquality equality) {
+ super(adapter, handler, baseNode, executionStrategy, suggestionStrategy, provider, equality);
+ }
+
+ @Override
+ void submitExecution(Execution execution) {
+ execution.run();
+ }
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/execution/ArgExecution.java b/branch-core/src/main/java/xyz/auriium/branch/base/execution/ArgExecution.java
new file mode 100644
index 0000000..1b2cf66
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/execution/ArgExecution.java
@@ -0,0 +1,26 @@
+package xyz.auriium.branch.base.execution;
+
+import xyz.auriium.branch.base.EnhancedNodeContext;
+import xyz.auriium.branch.nodes.argument.ArgumentContext;
+import xyz.auriium.branch.nodes.argument.ArgumentContextHandler;
+import xyz.auriium.branch.nodes.argument.Arguments;
+
+public class ArgExecution implements Execution {
+
+ private final ArgumentContextHandler handler;
+ private final EnhancedNodeContext node;
+ private final Arguments arguments;
+
+ public ArgExecution(ArgumentContextHandler handler, EnhancedNodeContext node, Arguments arguments) {
+ this.handler = handler;
+ this.node = node;
+ this.arguments = arguments;
+ }
+
+
+ @Override
+ public void run() {
+ handler.handle(new ArgumentContext<>(node, arguments));
+ }
+
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/execution/BasicExecution.java b/branch-core/src/main/java/xyz/auriium/branch/base/execution/BasicExecution.java
new file mode 100644
index 0000000..886a602
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/execution/BasicExecution.java
@@ -0,0 +1,20 @@
+package xyz.auriium.branch.base.execution;
+
+import xyz.auriium.branch.base.EnhancedNodeContext;
+
+public class BasicExecution implements Execution {
+
+ private final ExecutionHandler handler;
+ private final EnhancedNodeContext node;
+
+ public BasicExecution(ExecutionHandler handler, EnhancedNodeContext node) {
+ this.handler = handler;
+ this.node = node;
+ }
+
+ @Override
+ public void run() {
+ handler.handle(node);
+ }
+
+}
diff --git a/core/src/main/java/me/aurium/branch/execution/EmptyExecutionHandler.java b/branch-core/src/main/java/xyz/auriium/branch/base/execution/EmptyExecutionHandler.java
similarity index 85%
rename from core/src/main/java/me/aurium/branch/execution/EmptyExecutionHandler.java
rename to branch-core/src/main/java/xyz/auriium/branch/base/execution/EmptyExecutionHandler.java
index 3ba74c8..d8c7381 100644
--- a/core/src/main/java/me/aurium/branch/execution/EmptyExecutionHandler.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/execution/EmptyExecutionHandler.java
@@ -19,13 +19,13 @@
*
*/
-package me.aurium.branch.execution;
+package xyz.auriium.branch.base.execution;
-import me.aurium.branch.execution.api.ExecutionHandler;
+import xyz.auriium.branch.base.EnhancedNodeContext;
public class EmptyExecutionHandler implements ExecutionHandler {
@Override
- public void handle(NodeContext adapter) {
+ public void handle(EnhancedNodeContext adapter) {
}
}
diff --git a/core/src/main/java/me/aurium/branch/execution/Block.java b/branch-core/src/main/java/xyz/auriium/branch/base/execution/Execution.java
similarity index 73%
rename from core/src/main/java/me/aurium/branch/execution/Block.java
rename to branch-core/src/main/java/xyz/auriium/branch/base/execution/Execution.java
index b8048c1..35dccd0 100644
--- a/core/src/main/java/me/aurium/branch/execution/Block.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/execution/Execution.java
@@ -19,16 +19,14 @@
*
*/
-package me.aurium.branch.execution;
+package xyz.auriium.branch.base.execution;
/**
- * Represents an unparsed component of a command argument input structure
+ * Marker runnable representing the supplying of all required dependencies to an execution handler
+ * or significant derivative and actual execution of said handler.
+ *
+ * @param the type
*/
-public interface Block {
-
- String getIdentifier();
-
- boolean equals(Object object);
- boolean isVisual();
+public interface Execution extends Runnable {
}
diff --git a/core/src/main/java/me/aurium/branch/execution/api/ExecutionHandler.java b/branch-core/src/main/java/xyz/auriium/branch/base/execution/ExecutionHandler.java
similarity index 86%
rename from core/src/main/java/me/aurium/branch/execution/api/ExecutionHandler.java
rename to branch-core/src/main/java/xyz/auriium/branch/base/execution/ExecutionHandler.java
index e4e2a1c..73be61f 100644
--- a/core/src/main/java/me/aurium/branch/execution/api/ExecutionHandler.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/execution/ExecutionHandler.java
@@ -19,9 +19,9 @@
*
*/
-package me.aurium.branch.execution.api;
+package xyz.auriium.branch.base.execution;
-import me.aurium.branch.execution.NodeContext;
+import xyz.auriium.branch.base.EnhancedNodeContext;
/**
* Functional interface typically used in simple nodes that only need to do one action
@@ -30,6 +30,6 @@
@FunctionalInterface
public interface ExecutionHandler {
- void handle(NodeContext context);
+ void handle(EnhancedNodeContext context);
}
diff --git a/core/src/main/java/me/aurium/branch/fallback/strategies/FallbackSearchStrategy.java b/branch-core/src/main/java/xyz/auriium/branch/base/execution/ExecutionSearchStrategy.java
similarity index 68%
rename from core/src/main/java/me/aurium/branch/fallback/strategies/FallbackSearchStrategy.java
rename to branch-core/src/main/java/xyz/auriium/branch/base/execution/ExecutionSearchStrategy.java
index 53898d0..7092d8b 100644
--- a/core/src/main/java/me/aurium/branch/fallback/strategies/FallbackSearchStrategy.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/execution/ExecutionSearchStrategy.java
@@ -19,11 +19,13 @@
*
*/
-package me.aurium.branch.fallback.strategies;
+package xyz.auriium.branch.base.execution;
-import me.aurium.branch.nodes.CommandNode;
-import me.aurium.branch.nodes.results.SearchInfo;
-import me.aurium.branch.nodes.results.model.Result;
+import xyz.auriium.branch.base.NodeContext;
+import xyz.auriium.branch.nodes.CommandNode;
+import xyz.auriium.branch.results.PreProcessSearch;
+import xyz.auriium.branch.results.SearcherEquality;
+import xyz.auriium.branch.results.Result;
/**
* A strategy to define
@@ -32,10 +34,10 @@
* - what happens if a node is unusable
* @param
*/
-public interface FallbackSearchStrategy {
+public interface ExecutionSearchStrategy {
- Result> attemptPreprocess(T sender, String alias, String[] args, CommandNode baseNode);
+ Result> attemptPreprocess(NodeContext context, SearcherEquality equality, CommandNode baseNode);
}
diff --git a/core/src/main/java/me/aurium/branch/fallback/strategies/OneBackStrategy.java b/branch-core/src/main/java/xyz/auriium/branch/base/execution/OneBackStrategy.java
similarity index 72%
rename from core/src/main/java/me/aurium/branch/fallback/strategies/OneBackStrategy.java
rename to branch-core/src/main/java/xyz/auriium/branch/base/execution/OneBackStrategy.java
index 9f0e971..cefb62f 100644
--- a/core/src/main/java/me/aurium/branch/fallback/strategies/OneBackStrategy.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/execution/OneBackStrategy.java
@@ -19,17 +19,17 @@
*
*/
-package me.aurium.branch.fallback.strategies;
+package xyz.auriium.branch.base.execution;
-import me.aurium.branch.interfacing.responses.NoPermissionResponse;
-import me.aurium.branch.nodes.CommandNode;
-import me.aurium.branch.nodes.results.SearchInput;
-import me.aurium.branch.nodes.results.SearchInfo;
-import me.aurium.branch.nodes.results.model.Result;
+import xyz.auriium.branch.base.NodeContext;
+import xyz.auriium.branch.interfacing.exceptional.anomalies.NoPermissionAnomaly;
+import xyz.auriium.branch.nodes.CommandNode;
+import xyz.auriium.branch.results.InitialSearch;
+import xyz.auriium.branch.results.PreProcessSearch;
+import xyz.auriium.branch.results.Result;
+import xyz.auriium.branch.results.SearcherEquality;
/**
- *
- * /// FIXME: 5/7/2021 This strat is possibly broken thanks to the update that changes nodes to return execution results.
*
* Fallback and processing strategy that does the following actions:
*
@@ -51,25 +51,25 @@
*
* @param
*/
-public class OneBackStrategy implements FallbackSearchStrategy {
+public class OneBackStrategy implements ExecutionSearchStrategy {
@Override
- public Result> attemptPreprocess(T sender, String alias, String[] args, CommandNode baseNode) {
+ public Result> attemptPreprocess(NodeContext ctx, SearcherEquality equality, CommandNode baseNode) {
- SearchInput input = SearchInput.of(args);
- Result> toBeExecuted = baseNode.getSpecificNode(input);
+ InitialSearch search = InitialSearch.of(equality, ctx.getArgs());
+ Result> toBeExecuted = baseNode.searchNode(search);
//1. Check permissions and access (preprocessing)
- while (toBeExecuted.isSuccessful() && !toBeExecuted.getSuccess().resultingNode().getPermission().attempt(sender, alias, args)) {
+ while (toBeExecuted.isSuccessful() && !toBeExecuted.getSuccess().getFoundNode().getPermission().attempt(ctx)) {
//something is wrong with the execution (e.g. wrong args or you did something bad), pass above one.
- if (toBeExecuted.getSuccess().resultingNode().equals(baseNode)) {
- return Result.fail(new NoPermissionResponse(baseNode.getPermission().failureIdentifiableName()));
+ if (toBeExecuted.getSuccess().getFoundNode().equals(baseNode)) {
+ return Result.fail(new NoPermissionAnomaly(baseNode.getPermission().failureIdentifiableName()));
} else {
- toBeExecuted = baseNode.getSpecificNode(input.withoutTop()); //regress backwards a node
+ toBeExecuted = baseNode.searchNode(search = InitialSearch.withoutTop(search)); //regress backwards a node //TODO fix all of this
}
}
@@ -77,8 +77,6 @@ public Result> attemptPreprocess(T sender, String alias, String[]
}
-
- //TODO old code - refer to it if you need to
/*SearchInput input = SearchInput.of(args);
SearchResult toBeExecuted = baseNode.getSpecificNode(input);
diff --git a/core/src/main/java/me/aurium/branch/fallback/strategies/PermissionLockoutStrategy.java b/branch-core/src/main/java/xyz/auriium/branch/base/execution/PermissionLockoutStrategy.java
similarity index 52%
rename from core/src/main/java/me/aurium/branch/fallback/strategies/PermissionLockoutStrategy.java
rename to branch-core/src/main/java/xyz/auriium/branch/base/execution/PermissionLockoutStrategy.java
index 0b67c80..c3298ba 100644
--- a/core/src/main/java/me/aurium/branch/fallback/strategies/PermissionLockoutStrategy.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/execution/PermissionLockoutStrategy.java
@@ -19,28 +19,32 @@
*
*/
-package me.aurium.branch.fallback.strategies;
+package xyz.auriium.branch.base.execution;
-import me.aurium.branch.interfacing.responses.NoPermissionResponse;
-import me.aurium.branch.nodes.CommandNode;
-import me.aurium.branch.nodes.results.SearchInfo;
-import me.aurium.branch.nodes.results.SearchInput;
-import me.aurium.branch.nodes.results.model.Result;
+import xyz.auriium.branch.base.NodeContext;
+import xyz.auriium.branch.interfacing.exceptional.anomalies.NoPermissionAnomaly;
+import xyz.auriium.branch.nodes.CommandNode;
+import xyz.auriium.branch.results.InitialSearch;
+import xyz.auriium.branch.results.PreProcessSearch;
+import xyz.auriium.branch.results.Result;
+import xyz.auriium.branch.results.SearcherEquality;
/**
* Simple fallback strategy that if the sender has no permission to execute the command they are sent a failing response.
* @param
*/
-public class PermissionLockoutStrategy implements FallbackSearchStrategy {
+public class PermissionLockoutStrategy implements ExecutionSearchStrategy {
+
@Override
- public Result> attemptPreprocess(T sender, String alias, String[] args, CommandNode baseNode) {
+ public Result> attemptPreprocess(NodeContext ctx, SearcherEquality equality, CommandNode baseNode) {
- SearchInput input = SearchInput.of(args);
- Result> toBeExecuted = baseNode.getSpecificNode(input);
+ InitialSearch search = InitialSearch.of(equality, ctx.getArgs());
+ Result> toBeExecuted = baseNode.searchNode(search);
//peak object oriented code
- if (toBeExecuted.isSuccessful() && !toBeExecuted.getSuccess().resultingNode().getPermission().attempt(sender, alias, args)) {
- return Result.fail(new NoPermissionResponse(toBeExecuted.getSuccess().resultingNode().getPermission().failureIdentifiableName()));
+
+ if (toBeExecuted.isSuccessful() && !toBeExecuted.getSuccess().getFoundNode().getPermission().attempt(ctx)) {
+ return Result.fail(new NoPermissionAnomaly(toBeExecuted.getSuccess().getFoundNode().getPermission().failureIdentifiableName()));
}
return toBeExecuted;
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/ArgumentBlock.java b/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/ArgumentBlock.java
new file mode 100644
index 0000000..63d3813
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/ArgumentBlock.java
@@ -0,0 +1,34 @@
+package xyz.auriium.branch.base.execution.blocks;
+
+public class ArgumentBlock implements Block {
+
+ private final String label;
+ private final String argumentType;
+ private final boolean isOptional;
+
+ public ArgumentBlock(String label, String argumentType, boolean isOptional) {
+ this.label = label;
+ this.argumentType = argumentType;
+ this.isOptional = isOptional;
+ }
+
+ @Override
+ public String getLabel() {
+ return label;
+ }
+
+ @Override
+ public String getType() {
+ return argumentType;
+ }
+
+ @Override
+ public BracketPattern getBracketPattern() {
+ return isOptional ? new BracketPattern('<','>') : new BracketPattern('[',']');
+ }
+
+ @Override
+ public BlockType getTypeObject() {
+ return isOptional ? BlockType.ARGUMENT_OPTIONAL : BlockType.ARGUMENT_REQUIRED;
+ }
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/Block.java b/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/Block.java
new file mode 100644
index 0000000..9d635e8
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/Block.java
@@ -0,0 +1,84 @@
+/*
+ *
+ * Branch
+ * Copyright © 2021 Aurium
+ *
+ * Branch is free software: you can redistribute it and/or modify
+ * It under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * Branch is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Branch. If not, see
+ * and navigate to version 3 of the GNU Affero General Public License.
+ *
+ */
+
+package xyz.auriium.branch.base.execution.blocks;
+
+/**
+ * Represents a Branch-provided identification structure for the identifier of specific structures
+ */
+public interface Block {
+
+ /**
+ * Gets the literal identifier of the block
+ *
+ * If the object is an endpoint block "join" of /kitpvp join, the identifier is "join"
+ * (pretty obvious)
+ * @return the identifier
+ */
+ String getLabel();
+
+ /**
+ * Gets the prettified "version" of the block used to display it
+ *
+ * If the object is an endpoint block "join" of /kitpvp join,
+ * the prettified identifier will be ""
+ *
+ * @return the pretty string alone
+ */
+ default String getPretty() {
+ return getBracketPattern().parse(getLabel());
+ }
+
+ /**
+ * Gets identifier and type wrapped with prettified bracketing
+ *
+ * If the object is an endpoint block "join" of /kitpvp join, the
+ * prettified + type string is ""
+ *
+ * @return the prettified string
+ */
+ default String getPrettyAndType() {
+ return getBracketPattern().parse(String.format("%s:%s", getType(), getLabel()));
+ }
+
+ /**
+ * Gets just the type string used for this object. Typically delegates to {@link #getTypeObject()} except
+ * for argument blocks, in which case
+ * @return the type
+ */
+ String getType();
+
+ /**
+ * Returns a bracket pattern for use with {@link #getPretty()}
+ * @return returns the bracket pattern
+ */
+ BracketPattern getBracketPattern();
+
+ /**
+ * Gets the blocktype this belongs to
+ * @return the blocktype
+ */
+ BlockType getTypeObject();
+
+ default boolean matches(String string) {
+ return getLabel().equalsIgnoreCase(string);
+ }
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/BlockType.java b/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/BlockType.java
new file mode 100644
index 0000000..682a7fc
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/BlockType.java
@@ -0,0 +1,23 @@
+package xyz.auriium.branch.base.execution.blocks;
+
+public enum BlockType {
+
+ INPUT("input"),
+
+ LITERAL_GROUP("subgroup"), //used for blocks representing a subgroup's identifier e.g. group in /command group [bar]
+ LITERAL_ENDPOINT("endpoint"), //used for blocks representing an endpoint command's identifier e.g. help or join in /command help or /command kitpvp join
+ ARGUMENT_OPTIONAL("optional"), //used for blocks representing a command's optional argument e.g. bar in /command group [bar]
+ ARGUMENT_REQUIRED("required"), //used for blocks representing a required argument e.g. foo in /command group [bar]
+
+ LITERAL_CUSTOM("custom"); //for framework-user implemented blocks (why?)
+
+ String readable;
+
+ BlockType(String humanReadable) {
+ readable = humanReadable;
+ }
+
+ public String getReadable() {
+ return readable;
+ }
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/BracketPattern.java b/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/BracketPattern.java
new file mode 100644
index 0000000..839962d
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/BracketPattern.java
@@ -0,0 +1,32 @@
+package xyz.auriium.branch.base.execution.blocks;
+
+public class BracketPattern {
+
+ private final Character startChar;
+ private final Character closeChar;
+
+ public BracketPattern(Character startChar, Character closeChar) {
+ this.startChar = startChar;
+ this.closeChar = closeChar;
+ }
+
+ public String parse(String input) {
+ StringBuilder builder = new StringBuilder();
+
+ if (startChar != null) {
+ builder.append(startChar);
+ }
+
+ builder.append(input);
+
+ if (closeChar != null) {
+ builder.append(closeChar);
+ }
+
+ return builder.toString();
+ }
+
+ public static BracketPattern empty() {
+ return new BracketPattern(null, null);
+ }
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/EndpointBlock.java b/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/EndpointBlock.java
new file mode 100644
index 0000000..0f03b20
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/EndpointBlock.java
@@ -0,0 +1,30 @@
+package xyz.auriium.branch.base.execution.blocks;
+
+public class EndpointBlock implements Block {
+
+ private final String endpointIdentifier;
+
+ public EndpointBlock(String endpointIdentifier) {
+ this.endpointIdentifier = endpointIdentifier;
+ }
+
+ @Override
+ public String getLabel() {
+ return endpointIdentifier;
+ }
+
+ @Override
+ public String getType() {
+ return BlockType.LITERAL_ENDPOINT.getReadable();
+ }
+
+ @Override
+ public BracketPattern getBracketPattern() {
+ return BracketPattern.empty();
+ }
+
+ @Override
+ public BlockType getTypeObject() {
+ return BlockType.LITERAL_ENDPOINT;
+ }
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/GroupBlock.java b/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/GroupBlock.java
new file mode 100644
index 0000000..6555fba
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/execution/blocks/GroupBlock.java
@@ -0,0 +1,30 @@
+package xyz.auriium.branch.base.execution.blocks;
+
+public class GroupBlock implements Block {
+
+ private final String groupName;
+
+ public GroupBlock(String groupName) {
+ this.groupName = groupName;
+ }
+
+ @Override
+ public String getLabel() {
+ return groupName;
+ }
+
+ @Override
+ public String getType() {
+ return BlockType.LITERAL_GROUP.getReadable();
+ }
+
+ @Override
+ public BracketPattern getBracketPattern() {
+ return BracketPattern.empty();
+ }
+
+ @Override
+ public BlockType getTypeObject() {
+ return BlockType.LITERAL_GROUP;
+ }
+}
diff --git a/core/src/main/java/me/aurium/branch/fallback/permissions/EmptyPermission.java b/branch-core/src/main/java/xyz/auriium/branch/base/permissions/EmptyPermission.java
similarity index 72%
rename from core/src/main/java/me/aurium/branch/fallback/permissions/EmptyPermission.java
rename to branch-core/src/main/java/xyz/auriium/branch/base/permissions/EmptyPermission.java
index 01c9677..5dc8c91 100644
--- a/core/src/main/java/me/aurium/branch/fallback/permissions/EmptyPermission.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/permissions/EmptyPermission.java
@@ -19,7 +19,9 @@
*
*/
-package me.aurium.branch.fallback.permissions;
+package xyz.auriium.branch.base.permissions;
+
+import xyz.auriium.branch.base.NodeContext;
/**
* Represents a permission that is always true
@@ -27,8 +29,12 @@
*/
public class EmptyPermission implements Permission {
+ private static final EmptyPermission> INSTANCE = new EmptyPermission<>();
+
+ EmptyPermission() {}
+
@Override
- public boolean attempt(T sender, String alias, String[] args) {
+ public boolean attempt(NodeContext nodeContext) {
return true;
}
@@ -36,4 +42,9 @@ public boolean attempt(T sender, String alias, String[] args) {
public String failureIdentifiableName() {
return "None";
}
+
+ @SuppressWarnings("unchecked")
+ public static EmptyPermission instance() {
+ return (EmptyPermission) INSTANCE;
+ }
}
diff --git a/core/src/main/java/me/aurium/branch/fallback/permissions/Permission.java b/branch-core/src/main/java/xyz/auriium/branch/base/permissions/Permission.java
similarity index 69%
rename from core/src/main/java/me/aurium/branch/fallback/permissions/Permission.java
rename to branch-core/src/main/java/xyz/auriium/branch/base/permissions/Permission.java
index ab13801..a338e37 100644
--- a/core/src/main/java/me/aurium/branch/fallback/permissions/Permission.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/permissions/Permission.java
@@ -19,9 +19,9 @@
*
*/
-package me.aurium.branch.fallback.permissions;
+package xyz.auriium.branch.base.permissions;
-import me.aurium.branch.execution.NodeContext;
+import xyz.auriium.branch.base.NodeContext;
/**
* Represents the accessibility predicate of a command -> whether a command can be executed or not
@@ -29,17 +29,13 @@
public interface Permission {
/**
- * Checks whether the sender has acccess or not
- * @param sender sender
- * @param alias alias
- * @param args args
- * @return true if so, false if not
+ * Method describing whether the permission accepts the context
+ *
+ *
+ * @param nodeContext ctx
+ * @return true if permission is had, otherwise false
*/
- boolean attempt(T sender, String alias, String[] args); //because fuck you
-
- default boolean attempt(NodeContext nodeContext) {
- return attempt(nodeContext.getSender(),nodeContext.getAlias(), nodeContext.getArgs());
- }
+ boolean attempt(NodeContext nodeContext);
/**
* Represents the name shown when the permission fails.
diff --git a/core/src/main/java/me/aurium/branch/fallback/permissions/PredicatePermission.java b/branch-core/src/main/java/xyz/auriium/branch/base/permissions/PredicatePermission.java
similarity index 78%
rename from core/src/main/java/me/aurium/branch/fallback/permissions/PredicatePermission.java
rename to branch-core/src/main/java/xyz/auriium/branch/base/permissions/PredicatePermission.java
index 53c55b3..44cba9a 100644
--- a/core/src/main/java/me/aurium/branch/fallback/permissions/PredicatePermission.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/permissions/PredicatePermission.java
@@ -19,7 +19,9 @@
*
*/
-package me.aurium.branch.fallback.permissions;
+package xyz.auriium.branch.base.permissions;
+
+import xyz.auriium.branch.base.NodeContext;
import java.util.function.Predicate;
@@ -30,16 +32,16 @@
public class PredicatePermission implements Permission {
private final String easyName;
- private final Predicate predicate;
+ private final Predicate> predicate;
- public PredicatePermission(String easyName, Predicate predicate) {
+ public PredicatePermission(String easyName, Predicate> predicate) {
this.easyName = easyName;
this.predicate = predicate;
}
@Override
- public boolean attempt(T sender, String alias, String[] args) {
- return predicate.test(sender);
+ public boolean attempt(NodeContext ctx) {
+ return predicate.test(ctx);
}
@Override
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/permissions/StringPermission.java b/branch-core/src/main/java/xyz/auriium/branch/base/permissions/StringPermission.java
new file mode 100644
index 0000000..4b5d971
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/permissions/StringPermission.java
@@ -0,0 +1,22 @@
+package xyz.auriium.branch.base.permissions;
+
+import xyz.auriium.branch.base.NodeContext;
+
+public class StringPermission implements Permission {
+
+ private final String permissionNode;
+
+ public StringPermission(String permissionNode) {
+ this.permissionNode = permissionNode;
+ }
+
+ @Override
+ public boolean attempt(NodeContext nodeContext) {
+ return nodeContext.hasStringPermissible(permissionNode);
+ }
+
+ @Override
+ public String failureIdentifiableName() {
+ return permissionNode;
+ }
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/suggestion/AbstractSuggestionSearchStrategy.java b/branch-core/src/main/java/xyz/auriium/branch/base/suggestion/AbstractSuggestionSearchStrategy.java
new file mode 100644
index 0000000..88006ae
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/suggestion/AbstractSuggestionSearchStrategy.java
@@ -0,0 +1,46 @@
+package xyz.auriium.branch.base.suggestion;
+
+import xyz.auriium.branch.base.NodeContext;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Abstract suggestion strategy handler that
+ * @param
+ */
+public abstract class AbstractSuggestionSearchStrategy implements SuggestionSearchStrategy {
+
+ @Override
+ public List order(List> suggestions, NodeContext ctx) {
+ String[] strings = ctx.getArgs();
+
+ return copyPartialMatches(strings[strings.length - 1], order(suggestions, ctx));
+ }
+
+ abstract List orderThen(List> suggestions, NodeContext ctx);
+
+ private List copyPartialMatches(final String token, final Collection originals) throws UnsupportedOperationException, IllegalArgumentException {
+
+ List results = new ArrayList<>();
+
+ for (String string : originals) {
+
+ if (startsWithIgnoreCase(string, token)) {
+ results.add(string);
+ }
+
+ }
+
+ return results;
+ }
+
+ private boolean startsWithIgnoreCase(final String string, final String prefix) throws IllegalArgumentException, NullPointerException {
+ if (string.length() < prefix.length()) {
+ return false;
+ }
+ return string.regionMatches(true, 0, prefix, 0, prefix.length());
+ }
+
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/suggestion/CommonSuggestionSearchStrategy.java b/branch-core/src/main/java/xyz/auriium/branch/base/suggestion/CommonSuggestionSearchStrategy.java
new file mode 100644
index 0000000..3cd4e14
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/suggestion/CommonSuggestionSearchStrategy.java
@@ -0,0 +1,32 @@
+package xyz.auriium.branch.base.suggestion;
+
+import xyz.auriium.branch.base.NodeContext;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CommonSuggestionSearchStrategy extends AbstractSuggestionSearchStrategy {
+
+ private final boolean hideNoPermissions;
+
+ public CommonSuggestionSearchStrategy(boolean hideNoPermissions) {
+ this.hideNoPermissions = hideNoPermissions;
+ }
+
+ @Override
+ List orderThen(List> suggestions, NodeContext ctx) {
+
+ List strings = new ArrayList<>();
+
+ for (Suggestion suggestion : suggestions) {
+ if (hideNoPermissions) {
+ if (!suggestion.getPermission().attempt(ctx)) continue;
+ }
+
+
+ strings.add(suggestion.getIdentifier().getLabel());
+ }
+
+ return strings;
+ }
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/suggestion/Suggestion.java b/branch-core/src/main/java/xyz/auriium/branch/base/suggestion/Suggestion.java
new file mode 100644
index 0000000..7d1a7db
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/suggestion/Suggestion.java
@@ -0,0 +1,23 @@
+package xyz.auriium.branch.base.suggestion;
+
+import xyz.auriium.branch.base.execution.blocks.Block;
+import xyz.auriium.branch.base.permissions.Permission;
+
+public class Suggestion {
+
+ private final Permission permission;
+ private final Block identifier;
+
+ public Suggestion(Permission permission, Block identifier) {
+ this.permission = permission;
+ this.identifier = identifier;
+ }
+
+ public Permission getPermission() {
+ return permission;
+ }
+
+ public Block getIdentifier() {
+ return identifier;
+ }
+}
diff --git a/core/src/main/java/me/aurium/branch/execution/api/SuggestionHandler.java b/branch-core/src/main/java/xyz/auriium/branch/base/suggestion/SuggestionHandler.java
similarity index 84%
rename from core/src/main/java/me/aurium/branch/execution/api/SuggestionHandler.java
rename to branch-core/src/main/java/xyz/auriium/branch/base/suggestion/SuggestionHandler.java
index cac21fc..b726429 100644
--- a/core/src/main/java/me/aurium/branch/execution/api/SuggestionHandler.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/suggestion/SuggestionHandler.java
@@ -19,10 +19,9 @@
*
*/
-package me.aurium.branch.execution.api;
+package xyz.auriium.branch.base.suggestion;
-import me.aurium.branch.execution.Block;
-import me.aurium.branch.execution.NodeContext;
+import xyz.auriium.branch.base.NodeContext;
import java.util.List;
@@ -33,6 +32,6 @@
@FunctionalInterface
public interface SuggestionHandler {
- List handle(NodeContext context);
+ List handle(NodeContext context);
}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/base/suggestion/SuggestionSearchStrategy.java b/branch-core/src/main/java/xyz/auriium/branch/base/suggestion/SuggestionSearchStrategy.java
new file mode 100644
index 0000000..ea28ec7
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/base/suggestion/SuggestionSearchStrategy.java
@@ -0,0 +1,16 @@
+package xyz.auriium.branch.base.suggestion;
+
+import xyz.auriium.branch.base.NodeContext;
+
+import java.util.List;
+
+/**
+ * Retrieves a single suggestion completion based on contextual arguments: likely delegates to the nodes themselves
+ * as well as an adapter for conversion of type
+ * @param input type
+ */
+public interface SuggestionSearchStrategy {
+
+ List order(List> suggestions, NodeContext ctx);
+
+}
diff --git a/core/src/main/java/me/aurium/branch/interfacing/Message.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/Message.java
similarity index 96%
rename from core/src/main/java/me/aurium/branch/interfacing/Message.java
rename to branch-core/src/main/java/xyz/auriium/branch/interfacing/Message.java
index 11653ca..18905a8 100644
--- a/core/src/main/java/me/aurium/branch/interfacing/Message.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/Message.java
@@ -19,7 +19,7 @@
*
*/
-package me.aurium.branch.interfacing;
+package xyz.auriium.branch.interfacing;
/**
* Represents the final stage of something that occur after a response has been consumed
diff --git a/branch-core/src/main/java/xyz/auriium/branch/interfacing/MessageBoss.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/MessageBoss.java
new file mode 100644
index 0000000..55fa725
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/MessageBoss.java
@@ -0,0 +1,22 @@
+package xyz.auriium.branch.interfacing;
+
+/**
+ * MessageBoss represents message sending class - if a command sender fails adaptation or never even reaches adaptation
+ * phase it will be sent a message via type I interfacer, otherwise it will be sent a message via type A interfacer
+ *
+ * @param type I interfacer (I for initial type) handles communication with initial user
+ * @param type A of adapted type handles communication with converted user
+ * @param message object type (like Component for kyori or BreakMessage for default)
+ */
+public interface MessageBoss {
+
+ void sendMessageToInitial(String message, I initialType);
+ void sendMessageToAdapted(String message, A adaptedType);
+
+ void sendObjectToInitial(M message, I initialType);
+ void sendObjectToAdapted(M message, A adaptedType);
+
+
+
+
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/interfacing/MessageWorker.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/MessageWorker.java
new file mode 100644
index 0000000..e28a4d9
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/MessageWorker.java
@@ -0,0 +1,13 @@
+package xyz.auriium.branch.interfacing;
+
+/**
+ * Represents a subcomponent of a {@link xyz.auriium.branch.interfacing.MessageBoss} that only handles one type
+ * @param Type
+ * @param Message object type
+ */
+public interface MessageWorker {
+
+ void sendMessage(String message, T type);
+ void sendObject(M message, T type);
+
+}
diff --git a/core/src/main/java/me/aurium/branch/interfacing/ResponseAction.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/ResponseAction.java
similarity index 85%
rename from core/src/main/java/me/aurium/branch/interfacing/ResponseAction.java
rename to branch-core/src/main/java/xyz/auriium/branch/interfacing/ResponseAction.java
index b6a0e8a..02a7e1d 100644
--- a/core/src/main/java/me/aurium/branch/interfacing/ResponseAction.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/ResponseAction.java
@@ -19,14 +19,16 @@
*
*/
-package me.aurium.branch.interfacing;
+package xyz.auriium.branch.interfacing;
+
+import xyz.auriium.branch.interfacing.exceptional.Anomaly;
/**
* Represents an action that is fired when a response is received
* @param t
* @param c
*/
-public interface ResponseAction {
+public interface ResponseAction {
Message consume(C response);
diff --git a/branch-core/src/main/java/xyz/auriium/branch/interfacing/WorkerMessageBoss.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/WorkerMessageBoss.java
new file mode 100644
index 0000000..0099e63
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/WorkerMessageBoss.java
@@ -0,0 +1,35 @@
+package xyz.auriium.branch.interfacing;
+
+/**
+ * MessageBoss thta delegates to two MessageWorker
+ */
+public class WorkerMessageBoss implements MessageBoss {
+
+ private final MessageWorker initialWorker;
+ private final MessageWorker adaptedWorker;
+
+ public WorkerMessageBoss(MessageWorker initialWorker, MessageWorker adaptedWorker) {
+ this.initialWorker = initialWorker;
+ this.adaptedWorker = adaptedWorker;
+ }
+
+ @Override
+ public void sendMessageToInitial(String message, I initialType) {
+ this.initialWorker.sendMessage(message, initialType);
+ }
+
+ @Override
+ public void sendMessageToAdapted(String message, A adaptedType) {
+ this.adaptedWorker.sendMessage(message, adaptedType);
+ }
+
+ @Override
+ public void sendObjectToInitial(M message, I initialType) {
+ this.initialWorker.sendObject(message, initialType);
+ }
+
+ @Override
+ public void sendObjectToAdapted(M message, A adaptedType) {
+ this.adaptedWorker.sendObject(message, adaptedType);
+ }
+}
diff --git a/core/src/main/java/me/aurium/branch/interfacing/Response.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/Anomaly.java
similarity index 68%
rename from core/src/main/java/me/aurium/branch/interfacing/Response.java
rename to branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/Anomaly.java
index ad1b88a..c120e66 100644
--- a/core/src/main/java/me/aurium/branch/interfacing/Response.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/Anomaly.java
@@ -19,11 +19,16 @@
*
*/
-package me.aurium.branch.interfacing;
+package xyz.auriium.branch.interfacing.exceptional;
/**
- * Marker interface for a data-carrying object that can be consumed by a responseActionhandler
+ * Marker interface for a data-carrying control flow object that is
+ * similar to an exception. Key distinction in that it
+ * does not interrupt control flow by existing but rather must be manually
+ * returned. Typically carries data, consumed by a responseActionhandler
*/
-public interface Response {
+public interface Anomaly {
+
+ AnomalyType type();
}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/AnomalyHandler.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/AnomalyHandler.java
new file mode 100644
index 0000000..4b8880f
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/AnomalyHandler.java
@@ -0,0 +1,26 @@
+package xyz.auriium.branch.interfacing.exceptional;
+
+/**
+ * Represents the most outer-facing interface for interacting with and handling thrown anomalies and
+ * sending them to the player (interfacing).
+ *
+ * Typically delegates actual message handling to a {@link xyz.auriium.branch.interfacing.MessageBoss},
+ * whereas retrieval of captions to a {@link xyz.auriium.branch.interfacing.exceptional.caption.AnomalyCaptioner}
+ */
+public interface AnomalyHandler {
+
+ /**
+ * Communicates an anomaly to the user and/or to console
+ * @param notAdapted the anomaly
+ * @param anomaly the exceptional anomaly
+ */
+ void communicateNotAdapted(I notAdapted, Anomaly anomaly);
+
+ /**
+ * Commuicates an anomaly to the adapted user
+ * @param adapted adapted user
+ * @param anomaly anomaly
+ */
+ void communicateAdapted(A adapted, Anomaly anomaly);
+
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/AnomalyType.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/AnomalyType.java
new file mode 100644
index 0000000..a24fe75
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/AnomalyType.java
@@ -0,0 +1,10 @@
+package xyz.auriium.branch.interfacing.exceptional;
+
+public enum AnomalyType {
+
+ INVALID_SYNTAX,
+ INVALID_SENDER,
+ NO_PERMISSION,
+ ARGUMENT_PARSING
+
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/CommonAnomalyHandler.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/CommonAnomalyHandler.java
new file mode 100644
index 0000000..a7ed170
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/CommonAnomalyHandler.java
@@ -0,0 +1,32 @@
+package xyz.auriium.branch.interfacing.exceptional;
+
+import xyz.auriium.branch.interfacing.MessageBoss;
+import xyz.auriium.branch.interfacing.exceptional.caption.AnomalyCaptioner;
+import xyz.auriium.branch.interfacing.exceptional.printing.AnomalyPrinter;
+
+public class CommonAnomalyHandler implements AnomalyHandler{
+
+ private final MessageBoss messageBoss;
+ private final AnomalyPrinter handler;
+ private final AnomalyCaptioner captioner;
+
+ public CommonAnomalyHandler(MessageBoss messageBoss, AnomalyPrinter handler, AnomalyCaptioner captioner) {
+ this.messageBoss = messageBoss;
+ this.handler = handler;
+ this.captioner = captioner;
+ }
+
+ @Override
+ public void communicateNotAdapted(I notAdapted, Anomaly anomaly) {
+ messageBoss.sendObjectToInitial(make(anomaly), notAdapted);
+ }
+
+ @Override
+ public void communicateAdapted(A adapted, Anomaly anomaly) {
+ messageBoss.sendObjectToAdapted(make(anomaly), adapted);
+ }
+
+ M make(Anomaly anomaly) {
+ return handler.makeMessage(anomaly.type(), captioner.retrieveMessage(anomaly));
+ }
+}
diff --git a/core/src/main/java/me/aurium/branch/interfacing/responses/NoPermissionResponse.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/anomalies/NoPermissionAnomaly.java
similarity index 68%
rename from core/src/main/java/me/aurium/branch/interfacing/responses/NoPermissionResponse.java
rename to branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/anomalies/NoPermissionAnomaly.java
index dc50a4f..a98de67 100644
--- a/core/src/main/java/me/aurium/branch/interfacing/responses/NoPermissionResponse.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/anomalies/NoPermissionAnomaly.java
@@ -19,19 +19,28 @@
*
*/
-package me.aurium.branch.interfacing.responses;
+package xyz.auriium.branch.interfacing.exceptional.anomalies;
-import me.aurium.branch.interfacing.Response;
+import xyz.auriium.branch.interfacing.exceptional.Anomaly;
+import xyz.auriium.branch.interfacing.exceptional.AnomalyType;
-public class NoPermissionResponse implements Response {
+/**
+ * Response fired when someone lacks a permission
+ */
+public class NoPermissionAnomaly implements Anomaly {
private final String lackingPermission;
- public NoPermissionResponse(String lackingPermission) {
+ public NoPermissionAnomaly(String lackingPermission) {
this.lackingPermission = lackingPermission;
}
public String getLackingPermission() {
return lackingPermission;
}
+
+ @Override
+ public AnomalyType type() {
+ return AnomalyType.NO_PERMISSION;
+ }
}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/anomalies/TooFewInputsExternalAnomaly.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/anomalies/TooFewInputsExternalAnomaly.java
new file mode 100644
index 0000000..812906e
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/anomalies/TooFewInputsExternalAnomaly.java
@@ -0,0 +1,11 @@
+package xyz.auriium.branch.interfacing.exceptional.anomalies;
+
+import xyz.auriium.branch.interfacing.exceptional.Anomaly;
+import xyz.auriium.branch.interfacing.exceptional.AnomalyType;
+
+public class TooFewInputsExternalAnomaly implements Anomaly {
+ @Override
+ public AnomalyType type() {
+ return AnomalyType.INVALID_SYNTAX;
+ }
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/anomalies/TooFewInputsInternalAnomaly.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/anomalies/TooFewInputsInternalAnomaly.java
new file mode 100644
index 0000000..24d1087
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/anomalies/TooFewInputsInternalAnomaly.java
@@ -0,0 +1,12 @@
+package xyz.auriium.branch.interfacing.exceptional.anomalies;
+
+import xyz.auriium.branch.interfacing.exceptional.Anomaly;
+import xyz.auriium.branch.interfacing.exceptional.AnomalyType;
+
+public class TooFewInputsInternalAnomaly implements Anomaly {
+
+ @Override
+ public AnomalyType type() {
+ return AnomalyType.INVALID_SYNTAX;
+ }
+}
diff --git a/core/src/main/java/me/aurium/branch/interfacing/responses/FailedAdaptingResponse.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/anomalies/WrongTypeParseAnomaly.java
similarity index 73%
rename from core/src/main/java/me/aurium/branch/interfacing/responses/FailedAdaptingResponse.java
rename to branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/anomalies/WrongTypeParseAnomaly.java
index 6bf9ddd..a998065 100644
--- a/core/src/main/java/me/aurium/branch/interfacing/responses/FailedAdaptingResponse.java
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/anomalies/WrongTypeParseAnomaly.java
@@ -19,20 +19,22 @@
*
*/
-package me.aurium.branch.interfacing.responses;
+package xyz.auriium.branch.interfacing.exceptional.anomalies;
-import me.aurium.branch.interfacing.Response;
+import xyz.auriium.branch.interfacing.exceptional.Anomaly;
+import xyz.auriium.branch.interfacing.exceptional.AnomalyHandler;
+import xyz.auriium.branch.interfacing.exceptional.AnomalyType;
/**
* Represents a response to the scenario in which a certain object was attempted to be adapted to an extending type
* but it was not an instance of it (or similar scenarios, such as attempting to flatmap a certain type to another.)
*/
-public class FailedAdaptingResponse implements Response {
+public class WrongTypeParseAnomaly implements Anomaly {
private final Class> expectedClass;
private final Class> receivedClass;
- public FailedAdaptingResponse(Class> expectedClass, Class> receivedClass) {
+ public WrongTypeParseAnomaly(Class> expectedClass, Class> receivedClass) {
this.expectedClass = expectedClass;
this.receivedClass = receivedClass;
}
@@ -45,4 +47,8 @@ public Class> getReceivedClass() {
return receivedClass;
}
+ @Override
+ public AnomalyType type() {
+ return AnomalyType.INVALID_SENDER;
+ }
}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/caption/AnomalyCaptioner.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/caption/AnomalyCaptioner.java
new file mode 100644
index 0000000..f1afe03
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/caption/AnomalyCaptioner.java
@@ -0,0 +1,13 @@
+package xyz.auriium.branch.interfacing.exceptional.caption;
+
+import xyz.auriium.branch.interfacing.exceptional.Anomaly;
+
+/**
+ * Represents something that can handle anomalies and retrieve stringly simplified messages based on them
+ * These messages are then distributed to a AnomalyPrinter.
+ */
+public interface AnomalyCaptioner {
+
+ M retrieveMessage(Anomaly anomaly);
+
+}
diff --git a/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/caption/CommonAnomalyCaptioner.java b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/caption/CommonAnomalyCaptioner.java
new file mode 100644
index 0000000..951cfdc
--- /dev/null
+++ b/branch-core/src/main/java/xyz/auriium/branch/interfacing/exceptional/caption/CommonAnomalyCaptioner.java
@@ -0,0 +1,31 @@
+package xyz.auriium.branch.interfacing.exceptional.caption;
+
+import xyz.auriium.branch.interfacing.exceptional.Anomaly;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Function;
+
+public class CommonAnomalyCaptioner implements SettableCaptioner {
+
+ private final Map, Function extends Anomaly, M>> records = new HashMap<>();
+
+ @Override
+ public M retrieveMessage(Anomaly anomaly) {
+ return retrieve(anomaly).apply(anomaly);
+ }
+
+ @SuppressWarnings("unchecked")
+ private