aboutsummaryrefslogtreecommitdiff
path: root/azalea-brigadier/src/context
diff options
context:
space:
mode:
authormat <github@matdoes.dev>2022-04-17 14:02:13 -0500
committermat <github@matdoes.dev>2022-04-17 14:02:13 -0500
commita72a47ced76065caf739898954cd18edbc39174b (patch)
tree5526c7663f253bbd7c8318b9d98413f1f2074852 /azalea-brigadier/src/context
parent4ff67d4917ce333232189e86aee09f2d82451fc6 (diff)
downloadazalea-drasl-a72a47ced76065caf739898954cd18edbc39174b.tar.xz
Rewrite brigadier
Diffstat (limited to 'azalea-brigadier/src/context')
-rw-r--r--azalea-brigadier/src/context/command_context.rs93
-rw-r--r--azalea-brigadier/src/context/command_context_builder.rs176
-rw-r--r--azalea-brigadier/src/context/mod.rs6
-rw-r--r--azalea-brigadier/src/context/parsed_argument.rs24
-rw-r--r--azalea-brigadier/src/context/parsed_command_node.rs30
-rw-r--r--azalea-brigadier/src/context/string_range.rs45
-rw-r--r--azalea-brigadier/src/context/suggestion_context.rs6
7 files changed, 0 insertions, 380 deletions
diff --git a/azalea-brigadier/src/context/command_context.rs b/azalea-brigadier/src/context/command_context.rs
deleted file mode 100644
index 8db1487f..00000000
--- a/azalea-brigadier/src/context/command_context.rs
+++ /dev/null
@@ -1,93 +0,0 @@
-use super::{
- parsed_argument::ParsedArgument, parsed_command_node::ParsedCommandNode,
- string_range::StringRange,
-};
-use crate::{
- arguments::argument_type::ArgumentType, command::Command, redirect_modifier::RedirectModifier,
- tree::command_node::CommandNodeTrait,
-};
-use std::{any::Any, collections::HashMap};
-
-pub struct CommandContext<'a, S> {
- source: S,
- input: String,
- command: &'a dyn Command<S>,
- arguments: HashMap<String, ParsedArgument<Box<dyn Any>>>,
- root_node: &'a dyn CommandNodeTrait<S>,
- nodes: Vec<ParsedCommandNode<S>>,
- range: StringRange,
- child: Option<&'a CommandContext<'a, S>>,
- modifier: Option<&'a dyn RedirectModifier<S>>,
- forks: bool,
-}
-
-impl<S> CommandContext<'_, S>
-where
- S: PartialEq,
-{
- pub fn clone_for(&self, source: S) -> Self {
- if self.source == source {
- return *self;
- }
- Self {
- source,
- input: self.input.clone(),
- command: self.command.clone(),
- arguments: self.arguments.clone(),
- root_node: self.root_node.clone(),
- nodes: self.nodes.clone(),
- range: self.range.clone(),
- child: self.child.clone(),
- modifier: self.modifier.clone(),
- forks: self.forks,
- }
- }
-
- fn child(&self) -> &Option<CommandContext<S>> {
- &self.child
- }
-
- fn last_child(&self) -> &CommandContext<S> {
- let mut result = self;
- while result.child.is_some() {
- result = result.child.as_ref().unwrap();
- }
- result
- }
-
- fn command(&self) -> &dyn Command<S> {
- &self.command
- }
-
- fn source(&self) -> &S {
- &self.source
- }
-
- // public <V> V getArgument(final String name, final Class<V> clazz) {
- // final ParsedArgument<S, ?> argument = arguments.get(name);
-
- // if (argument == null) {
- // throw new IllegalArgumentException("No such argument '" + name + "' exists on this command");
- // }
-
- // final Object result = argument.getResult();
- // if (PRIMITIVE_TO_WRAPPER.getOrDefault(clazz, clazz).isAssignableFrom(result.getClass())) {
- // return (V) result;
- // } else {
- // throw new IllegalArgumentException("Argument '" + name + "' is defined as " + result.getClass().getSimpleName() + ", not " + clazz);
- // }
- // }
- fn get_argument<V>(&self, name: &str) -> Result<V, String> {
- let argument = self.arguments.get(name);
-
- if argument.is_none() {
- return Err(format!(
- "No such argument '{}' exists on this command",
- name
- ));
- }
-
- let result = argument.unwrap().result();
- Ok(result)
- }
-}
diff --git a/azalea-brigadier/src/context/command_context_builder.rs b/azalea-brigadier/src/context/command_context_builder.rs
deleted file mode 100644
index ba25849c..00000000
--- a/azalea-brigadier/src/context/command_context_builder.rs
+++ /dev/null
@@ -1,176 +0,0 @@
-use crate::{
- arguments::argument_type::ArgumentType, command::Command,
- command_dispatcher::CommandDispatcher, redirect_modifier::RedirectModifier,
- tree::command_node::CommandNodeTrait,
-};
-use std::fmt::Debug;
-use std::{any::Any, collections::HashMap};
-
-use super::{
- command_context::CommandContext, parsed_argument::ParsedArgument,
- parsed_command_node::ParsedCommandNode, string_range::StringRange,
- suggestion_context::SuggestionContext,
-};
-
-// public class CommandContextBuilder<S> {
-// private final Map<String, ParsedArgument<S, ?>> arguments = new LinkedHashMap<>();
-// private final CommandNode<S> rootNode;
-// private final List<ParsedCommandNode<S>> nodes = new ArrayList<>();
-// private final CommandDispatcher<S> dispatcher;
-// private S source;
-// private Command<S> command;
-// private CommandContextBuilder<S> child;
-// private StringRange range;
-// private RedirectModifier<S> modifier = null;
-// private boolean forks;
-
-#[derive(Clone)]
-pub struct CommandContextBuilder<'a, S> {
- arguments: HashMap<String, ParsedArgument<Box<dyn Any>>>,
- root_node: &'a dyn CommandNodeTrait<S>,
- nodes: Vec<ParsedCommandNode<S>>,
- dispatcher: CommandDispatcher<'a, S>,
- source: S,
- command: Box<dyn Command<S>>,
- child: Box<Option<CommandContextBuilder<'a, S>>>,
- range: StringRange,
- modifier: Option<Box<dyn RedirectModifier<S>>>,
- forks: bool,
-}
-
-// public CommandContextBuilder(final CommandDispatcher<S> dispatcher, final S source, final CommandNode<S> rootNode, final int start) {
-// this.rootNode = rootNode;
-// this.dispatcher = dispatcher;
-// this.source = source;
-// this.range = StringRange.at(start);
-// }
-
-impl<S> CommandContextBuilder<'_, S> {
- pub fn new(
- dispatcher: CommandDispatcher<S>,
- source: S,
- root_node: &dyn CommandNodeTrait<S>,
- start: usize,
- ) -> Self {
- Self {
- root_node: &root_node,
- dispatcher,
- source,
- range: StringRange::at(start),
- ..Default::default()
- }
- }
-
- pub fn with_source(mut self, source: S) -> Self {
- self.source = source;
- self
- }
-
- pub fn source(&self) -> &S {
- &self.source
- }
-
- pub fn root_node(&self) -> &dyn CommandNodeTrait<S> {
- &self.root_node
- }
-
- pub fn with_argument(mut self, name: String, argument: ParsedArgument<Box<dyn Any>>) -> Self {
- self.arguments.insert(name, argument);
- self
- }
-
- pub fn arguments(&self) -> &HashMap<String, ParsedArgument<Box<dyn Any>>> {
- &self.arguments
- }
-
- pub fn with_command(mut self, command: &dyn Command<S>) -> Self {
- self.command = command;
- self
- }
-
- pub fn with_node(mut self, node: dyn CommandNodeTrait<S>, range: StringRange) -> Self {
- self.nodes.push(ParsedCommandNode::new(node, range));
- self.range = StringRange::encompassing(&self.range, &range);
- self.modifier = node.redirect_modifier();
- self.forks = node.is_fork();
- self
- }
-
- pub fn with_child(mut self, child: CommandContextBuilder<S>) -> Self {
- self.child = Some(child);
- self
- }
-
- pub fn child(&self) -> Option<&CommandContextBuilder<S>> {
- self.child.as_ref()
- }
-
- pub fn last_child(&self) -> Option<&CommandContextBuilder<S>> {
- let mut result = self;
- while let Some(child) = result.child() {
- result = child;
- }
- Some(result)
- }
-
- pub fn command(&self) -> &dyn Command<S> {
- &*self.command
- }
-
- pub fn nodes(&self) -> &Vec<ParsedCommandNode<S>> {
- &self.nodes
- }
-
- pub fn build(self, input: &str) -> CommandContext<S> {
- CommandContext {
- source: self.source,
- input,
- arguments: self.arguments,
- command: self.command,
- root_node: self.root_node,
- nodes: self.nodes,
- range: self.range,
- child: self.child.map(|child| child.build(input)),
- modifier: self.modifier,
- forks: self.forks,
- }
- }
-
- pub fn dispatcher(&self) -> &CommandDispatcher<S> {
- &self.dispatcher
- }
-
- pub fn range(&self) -> &StringRange {
- &self.range
- }
-
- pub fn find_suggestion_context(&self, cursor: i32) -> Result<SuggestionContext<S>, String> {
- if self.range.start() <= cursor {
- if self.range.end() < cursor {
- if let Some(child) = self.child() {
- child.find_suggestion_context(cursor);
- } else if !self.nodes.is_empty() {
- let last = self.nodes.last().unwrap();
- let end = last.range().end() + 1;
- return SuggestionContext::new(last.node(), end);
- } else {
- return SuggestionContext::new(self.root_node, self.range.start());
- }
- } else {
- let prev = self.root_node;
- for node in &self.nodes {
- let node_range = node.range();
- if node_range.start() <= cursor && cursor <= node_range.end() {
- return SuggestionContext::new(prev, node_range.start());
- }
- prev = node.node();
- }
- if prev.is_none() {
- return Err(String::from("Can't find node before cursor"));
- }
- return SuggestionContext::new(prev.unwrap(), self.range.start());
- }
- }
- Err(String::from("Can't find node before cursor"))
- }
-}
diff --git a/azalea-brigadier/src/context/mod.rs b/azalea-brigadier/src/context/mod.rs
deleted file mode 100644
index 196d7c5b..00000000
--- a/azalea-brigadier/src/context/mod.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-pub mod command_context;
-pub mod command_context_builder;
-pub mod parsed_argument;
-pub mod parsed_command_node;
-pub mod string_range;
-pub mod suggestion_context;
diff --git a/azalea-brigadier/src/context/parsed_argument.rs b/azalea-brigadier/src/context/parsed_argument.rs
deleted file mode 100644
index e0bdf97b..00000000
--- a/azalea-brigadier/src/context/parsed_argument.rs
+++ /dev/null
@@ -1,24 +0,0 @@
-use super::string_range::StringRange;
-
-#[derive(PartialEq, Eq, Hash, Clone)]
-pub struct ParsedArgument<T> {
- range: StringRange,
- result: T,
-}
-
-impl<T> ParsedArgument<T> {
- fn new(start: usize, end: usize, result: &T) -> Self {
- Self {
- range: StringRange::between(start, end),
- result,
- }
- }
-
- fn range(&self) -> &StringRange {
- &self.range
- }
-
- fn result(&self) -> &T {
- &self.result
- }
-}
diff --git a/azalea-brigadier/src/context/parsed_command_node.rs b/azalea-brigadier/src/context/parsed_command_node.rs
deleted file mode 100644
index 21d1b2e9..00000000
--- a/azalea-brigadier/src/context/parsed_command_node.rs
+++ /dev/null
@@ -1,30 +0,0 @@
-use super::string_range::StringRange;
-use crate::tree::command_node::CommandNodeTrait;
-
-pub struct ParsedCommandNode<S> {
- node: Box<dyn CommandNodeTrait<S>>,
- range: StringRange,
-}
-
-impl<S> ParsedCommandNode<S> {
- fn new(node: dyn CommandNodeTrait<S>, range: StringRange) -> Self {
- Self { node, range }
- }
-
- fn node(&self) -> &dyn CommandNodeTrait<S> {
- &self.node
- }
-
- fn range(&self) -> &StringRange {
- &self.range
- }
-}
-
-impl<S> Clone for ParsedCommandNode<S> {
- fn clone_from(&mut self, source: &Self) {
- Self {
- node: self.node.clone(),
- range: self.range.clone(),
- }
- }
-}
diff --git a/azalea-brigadier/src/context/string_range.rs b/azalea-brigadier/src/context/string_range.rs
deleted file mode 100644
index 87098a1a..00000000
--- a/azalea-brigadier/src/context/string_range.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-use std::cmp;
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct StringRange {
- start: usize,
- end: usize,
-}
-
-impl StringRange {
- pub fn new(start: usize, end: usize) -> Self {
- Self { start, end }
- }
-
- pub fn at(pos: usize) -> Self {
- Self::new(pos, pos)
- }
-
- pub fn between(start: usize, end: usize) -> Self {
- Self::new(start, end)
- }
-
- pub fn encompassing(a: &Self, b: &Self) -> Self {
- Self::new(cmp::min(a.start, b.start), cmp::max(a.end, b.end))
- }
-
- pub fn start(&self) -> usize {
- self.start
- }
-
- pub fn end(&self) -> usize {
- self.end
- }
-
- pub fn get(&self, reader: &str) -> &str {
- &reader[self.start..self.end]
- }
-
- pub fn is_empty(&self) -> bool {
- self.start == self.end
- }
-
- pub fn length(&self) -> usize {
- self.end - self.start
- }
-}
diff --git a/azalea-brigadier/src/context/suggestion_context.rs b/azalea-brigadier/src/context/suggestion_context.rs
deleted file mode 100644
index 51a053c1..00000000
--- a/azalea-brigadier/src/context/suggestion_context.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-use crate::tree::command_node::CommandNodeTrait;
-
-pub struct SuggestionContext<'a, S> {
- parent: &'a dyn CommandNodeTrait<S>,
- start_pos: usize,
-}