diff options
| author | Ubuntu <github@matdoes.dev> | 2022-01-20 00:49:10 +0000 |
|---|---|---|
| committer | Ubuntu <github@matdoes.dev> | 2022-01-20 00:49:10 +0000 |
| commit | 30a86e1de5d8bf302f05d091b0a7b4cc6721d911 (patch) | |
| tree | 96b316ccfa29c74f6d37625dd1b72844ff36a49b | |
| parent | 760816c81fab414cc42ab1e75506fc816bcf9681 (diff) | |
| download | azalea-drasl-30a86e1de5d8bf302f05d091b0a7b4cc6721d911.tar.xz | |
bbbbbbbbbbbb
| -rw-r--r-- | azalea-brigadier/src/builder/argument_builder.rs | 36 | ||||
| -rw-r--r-- | azalea-brigadier/src/builder/literal_argument_builder.rs | 23 | ||||
| -rw-r--r-- | azalea-brigadier/src/builder/required_argument_builder.rs | 40 |
3 files changed, 60 insertions, 39 deletions
diff --git a/azalea-brigadier/src/builder/argument_builder.rs b/azalea-brigadier/src/builder/argument_builder.rs index 8c30bd44..ec2756ca 100644 --- a/azalea-brigadier/src/builder/argument_builder.rs +++ b/azalea-brigadier/src/builder/argument_builder.rs @@ -29,14 +29,11 @@ where } impl<'a, S> BaseArgumentBuilder<'a, S> { - pub fn then( - &mut self, - command: Box<dyn ArgumentBuilder<S, Self>>, - ) -> Result<&mut Self, String> { + pub fn then(&mut self, argument: Box<dyn CommandNode<S>>) -> Result<&mut Self, String> { if self.target.is_some() { return Err("Cannot add children to a redirected node".to_string()); } - self.command = Some(command); + Ok(self) } @@ -44,25 +41,25 @@ impl<'a, S> BaseArgumentBuilder<'a, S> { &self.arguments.get_children() } - pub fn executes(&mut self, command: dyn Command<S>) -> &mut Self { - self.command = command; + pub fn executes(&mut self, command: Box<dyn Command<S>>) -> &mut Self { + self.command = Some(command); self } - pub fn command(&self) -> dyn Command<S> { + pub fn command(&self) -> Option<Box<dyn Command<S>>> { self.command } - pub fn requires(&mut self, requirement: &dyn Fn(&S) -> bool) -> &mut Self { + pub fn requires(&mut self, requirement: Box<dyn Fn(&S) -> bool>) -> &mut Self { self.requirement = requirement; self } - pub fn requirement(&self) -> dyn Fn(&S) -> bool { + pub fn requirement(&self) -> Box<dyn Fn(&S) -> bool> { self.requirement } - pub fn redirect(&mut self, target: &dyn CommandNode<S>) -> &mut Self { + pub fn redirect(&mut self, target: Box<dyn CommandNode<S>>) -> &mut Self { self.forward(target, None, false) } @@ -85,8 +82,8 @@ impl<'a, S> BaseArgumentBuilder<'a, S> { pub fn forward( &mut self, - target: &dyn CommandNode<S>, - modifier: Option<&dyn RedirectModifier<S>>, + target: Box<dyn CommandNode<S>>, + modifier: Option<Box<dyn RedirectModifier<S>>>, fork: bool, ) -> Result<&mut Self, String> { if !self.arguments.get_children().is_empty() { @@ -130,3 +127,16 @@ impl<'a, S> BaseArgumentBuilder<'a, S> { result } } + +impl<S> Default for BaseArgumentBuilder<'_, S> { + fn default() -> Self { + Self { + arguments: Default::default(), + command: Default::default(), + requirement: Default::default(), + target: Default::default(), + modifier: Default::default(), + forks: Default::default(), + } + } +} diff --git a/azalea-brigadier/src/builder/literal_argument_builder.rs b/azalea-brigadier/src/builder/literal_argument_builder.rs index 0bd6071c..5bceb6eb 100644 --- a/azalea-brigadier/src/builder/literal_argument_builder.rs +++ b/azalea-brigadier/src/builder/literal_argument_builder.rs @@ -1,14 +1,23 @@ +use super::argument_builder::{ArgumentBuilder, BaseArgumentBuilder}; use crate::{ arguments::argument_type::ArgumentType, - tree::{command_node::CommandNode, literal_command_node::LiteralCommandNode}, + command::Command, + redirect_modifier::RedirectModifier, + tree::{ + command_node::CommandNode, literal_command_node::LiteralCommandNode, + root_command_node::RootCommandNode, + }, }; -use super::argument_builder::{ArgumentBuilder, BaseArgumentBuilder}; - pub struct LiteralArgumentBuilder<'a, S> { - literal: String, + arguments: RootCommandNode<'a, S>, + command: Option<Box<dyn Command<S>>>, + requirement: Box<dyn Fn(&S) -> bool>, + target: Option<Box<dyn CommandNode<S>>>, + modifier: Option<Box<dyn RedirectModifier<S>>>, + forks: bool, - pub base: BaseArgumentBuilder<'a, S>, + literal: String, } impl<'a, S> LiteralArgumentBuilder<'a, S> { @@ -31,10 +40,10 @@ where fn build(self) -> Box<dyn CommandNode<S>> { let result = LiteralCommandNode::new(self.literal, self.base.build()); - for argument in self.base.arguments { + for argument in self.base.arguments() { result.add_child(argument); } - result + Box::new(result) } } diff --git a/azalea-brigadier/src/builder/required_argument_builder.rs b/azalea-brigadier/src/builder/required_argument_builder.rs index b69c9dab..b577f3ed 100644 --- a/azalea-brigadier/src/builder/required_argument_builder.rs +++ b/azalea-brigadier/src/builder/required_argument_builder.rs @@ -8,14 +8,16 @@ use std::any::Any; use super::argument_builder::BaseArgumentBuilder; pub struct RequiredArgumentBuilder<'a, S> { - // private final String name; - // private final ArgumentType<T> type; - // private SuggestionProvider<S> suggestionsProvider = null; + arguments: RootCommandNode<'a, S>, + command: Option<Box<dyn Command<S>>>, + requirement: Box<dyn Fn(&S) -> bool>, + target: Option<Box<dyn CommandNode<S>>>, + modifier: Option<Box<dyn RedirectModifier<S>>>, + forks: bool, + name: String, type_: Box<dyn ArgumentType<Into = dyn Any>>, - suggestions_provider: Option<&'a dyn SuggestionProvider<S>>, - - pub base: BaseArgumentBuilder<'a, S>, + suggestions_provider: Option<Box<dyn SuggestionProvider<S>>>, } impl<'a, S> RequiredArgumentBuilder<'a, S> { @@ -24,29 +26,29 @@ impl<'a, S> RequiredArgumentBuilder<'a, S> { name, type_: type_, suggestions_provider: None, - base: BaseArgumentBuilder::new(name, type_), + base: BaseArgumentBuilder::default(), } } - pub fn argument(name: String, type_: dyn ArgumentType<Into = dyn Any>) -> Self { + pub fn argument(name: String, type_: Box<dyn ArgumentType<Into = dyn Any>>) -> Self { Self::new(name, type_) } - pub fn suggests(mut self, provider: &dyn SuggestionProvider<S>) -> Self { + pub fn suggests(mut self, provider: Box<dyn SuggestionProvider<S>>) -> Self { self.suggestions_provider = Some(provider); self } - pub fn suggestions_provider(&self) -> Option<&dyn SuggestionProvider<S>> { - self.suggestions_provider.as_ref() + pub fn suggestions_provider(&self) -> Option<Box<dyn SuggestionProvider<S>>> { + self.suggestions_provider } - pub fn get_type(&self) -> &dyn ArgumentType<Into = dyn Any> { + pub fn get_type(&self) -> Box<dyn ArgumentType<Into = dyn Any>> { self.type_ } pub fn name(&self) -> &str { - self.name + &self.name } // final ArgumentCommandNode<S> result = new ArgumentCommandNode<>(getName(), getType(), getCommand(), getRequirement(), getRedirect(), getRedirectModifier(), isFork(), getSuggestionsProvider()); @@ -59,19 +61,19 @@ impl<'a, S> RequiredArgumentBuilder<'a, S> { pub fn build(self) -> ArgumentCommandNode<'a, S> { let result = ArgumentCommandNode { name: self.name, - type_: &self.type_, + type_: self.type_, base: BaseCommandNode { - command: self.base.command, - requirement: self.base.requirement, - redirect: self.base.redirect, - modifier: self.base.modifier, + command: self.base.command(), + requirement: self.base.requirement(), + redirect: self.base.get_redirect(), + modifier: self.base.get_redirect_modifier(), forks: self.base.forks, ..BaseCommandNode::default() }, custom_suggestions: self.base.custom_suggestions, }; - for argument in self.base.arguments { + for argument in self.base.arguments() { result.add_child(argument); } |
