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>, - ) -> Result<&mut Self, String> { + pub fn then(&mut self, argument: Box>) -> 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) -> &mut Self { - self.command = command; + pub fn executes(&mut self, command: Box>) -> &mut Self { + self.command = Some(command); self } - pub fn command(&self) -> dyn Command { + pub fn command(&self) -> Option>> { self.command } - pub fn requires(&mut self, requirement: &dyn Fn(&S) -> bool) -> &mut Self { + pub fn requires(&mut self, requirement: Box bool>) -> &mut Self { self.requirement = requirement; self } - pub fn requirement(&self) -> dyn Fn(&S) -> bool { + pub fn requirement(&self) -> Box bool> { self.requirement } - pub fn redirect(&mut self, target: &dyn CommandNode) -> &mut Self { + pub fn redirect(&mut self, target: Box>) -> &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, - modifier: Option<&dyn RedirectModifier>, + target: Box>, + modifier: Option>>, 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 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>>, + requirement: Box bool>, + target: Option>>, + modifier: Option>>, + forks: bool, - pub base: BaseArgumentBuilder<'a, S>, + literal: String, } impl<'a, S> LiteralArgumentBuilder<'a, S> { @@ -31,10 +40,10 @@ where fn build(self) -> Box> { 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 type; - // private SuggestionProvider suggestionsProvider = null; + arguments: RootCommandNode<'a, S>, + command: Option>>, + requirement: Box bool>, + target: Option>>, + modifier: Option>>, + forks: bool, + name: String, type_: Box>, - suggestions_provider: Option<&'a dyn SuggestionProvider>, - - pub base: BaseArgumentBuilder<'a, S>, + suggestions_provider: Option>>, } 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) -> Self { + pub fn argument(name: String, type_: Box>) -> Self { Self::new(name, type_) } - pub fn suggests(mut self, provider: &dyn SuggestionProvider) -> Self { + pub fn suggests(mut self, provider: Box>) -> Self { self.suggestions_provider = Some(provider); self } - pub fn suggestions_provider(&self) -> Option<&dyn SuggestionProvider> { - self.suggestions_provider.as_ref() + pub fn suggestions_provider(&self) -> Option>> { + self.suggestions_provider } - pub fn get_type(&self) -> &dyn ArgumentType { + pub fn get_type(&self) -> Box> { self.type_ } pub fn name(&self) -> &str { - self.name + &self.name } // final ArgumentCommandNode 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); }