From b8ceb56e7141320d5ba23a946fe3eceee43f51f5 Mon Sep 17 00:00:00 2001 From: mat Date: Mon, 18 Apr 2022 19:38:08 -0500 Subject: move `parsers` into `arguments` --- azalea-brigadier/src/arguments/argument_type.rs | 7 +++ .../src/arguments/integer_argument_type.rs | 54 +++++++++++++++++++++ azalea-brigadier/src/arguments/mod.rs | 4 ++ azalea-brigadier/src/builder/argument_builder.rs | 2 +- .../src/builder/required_argument_builder.rs | 10 ++-- azalea-brigadier/src/command_dispatcher.rs | 2 +- azalea-brigadier/src/lib.rs | 4 +- azalea-brigadier/src/parsers.rs | 56 ---------------------- 8 files changed, 75 insertions(+), 64 deletions(-) create mode 100644 azalea-brigadier/src/arguments/argument_type.rs create mode 100644 azalea-brigadier/src/arguments/integer_argument_type.rs create mode 100644 azalea-brigadier/src/arguments/mod.rs delete mode 100644 azalea-brigadier/src/parsers.rs diff --git a/azalea-brigadier/src/arguments/argument_type.rs b/azalea-brigadier/src/arguments/argument_type.rs new file mode 100644 index 00000000..029e4696 --- /dev/null +++ b/azalea-brigadier/src/arguments/argument_type.rs @@ -0,0 +1,7 @@ +use std::{any::Any, rc::Rc}; + +use crate::{exceptions::CommandSyntaxException, string_reader::StringReader}; + +pub trait ArgumentType { + fn parse(&self, reader: &mut StringReader) -> Result, CommandSyntaxException>; +} diff --git a/azalea-brigadier/src/arguments/integer_argument_type.rs b/azalea-brigadier/src/arguments/integer_argument_type.rs new file mode 100644 index 00000000..336046a7 --- /dev/null +++ b/azalea-brigadier/src/arguments/integer_argument_type.rs @@ -0,0 +1,54 @@ +use std::{any::Any, rc::Rc}; + +use crate::{ + context::CommandContext, + exceptions::{BuiltInExceptions, CommandSyntaxException}, + string_reader::StringReader, +}; + +use super::ArgumentType; + +#[derive(Default)] +struct Integer { + pub minimum: Option, + pub maximum: Option, +} + +impl ArgumentType for Integer { + fn parse(&self, reader: &mut StringReader) -> Result, CommandSyntaxException> { + let start = reader.cursor; + let result = reader.read_int()?; + if let Some(minimum) = self.minimum { + if result < minimum { + reader.cursor = start; + return Err(BuiltInExceptions::IntegerTooSmall { + found: result, + min: minimum, + } + .create_with_context(reader)); + } + } + if let Some(maximum) = self.maximum { + if result > maximum { + reader.cursor = start; + return Err(BuiltInExceptions::IntegerTooBig { + found: result, + max: maximum, + } + .create_with_context(reader)); + } + } + Ok(Rc::new(result)) + } +} + +pub fn integer() -> impl ArgumentType { + Integer::default() +} +pub fn get_integer(context: &CommandContext, name: &str) -> Option { + context + .argument(name) + .unwrap() + .downcast_ref::() + .copied() +} diff --git a/azalea-brigadier/src/arguments/mod.rs b/azalea-brigadier/src/arguments/mod.rs new file mode 100644 index 00000000..dec39297 --- /dev/null +++ b/azalea-brigadier/src/arguments/mod.rs @@ -0,0 +1,4 @@ +mod argument_type; +pub mod integer_argument_type; + +pub use argument_type::ArgumentType; diff --git a/azalea-brigadier/src/builder/argument_builder.rs b/azalea-brigadier/src/builder/argument_builder.rs index dee6ccfe..14d41f4e 100644 --- a/azalea-brigadier/src/builder/argument_builder.rs +++ b/azalea-brigadier/src/builder/argument_builder.rs @@ -141,8 +141,8 @@ mod tests { use std::rc::Rc; use crate::{ + arguments::integer_argument_type::integer, builder::{literal_argument_builder::literal, required_argument_builder::argument}, - parsers::integer, }; use super::ArgumentBuilder; diff --git a/azalea-brigadier/src/builder/required_argument_builder.rs b/azalea-brigadier/src/builder/required_argument_builder.rs index a50f7ea9..9d4d9e0a 100644 --- a/azalea-brigadier/src/builder/required_argument_builder.rs +++ b/azalea-brigadier/src/builder/required_argument_builder.rs @@ -1,5 +1,7 @@ use super::argument_builder::{ArgumentBuilder, ArgumentBuilderType}; -use crate::{exceptions::CommandSyntaxException, parsers::Parser, string_reader::StringReader}; +use crate::{ + arguments::ArgumentType, exceptions::CommandSyntaxException, string_reader::StringReader, +}; use std::{any::Any, fmt::Debug, rc::Rc}; /// An argument node type. The `T` type parameter is the type of the argument, @@ -7,10 +9,10 @@ use std::{any::Any, fmt::Debug, rc::Rc}; #[derive(Clone)] pub struct Argument { pub name: String, - parser: Rc, + parser: Rc, } impl Argument { - pub fn new(name: &str, parser: Rc) -> Self { + pub fn new(name: &str, parser: Rc) -> Self { Self { name: name.to_string(), parser, @@ -38,6 +40,6 @@ impl Debug for Argument { } /// Shortcut for creating a new argument builder node. -pub fn argument(name: &str, parser: impl Parser + 'static) -> ArgumentBuilder { +pub fn argument(name: &str, parser: impl ArgumentType + 'static) -> ArgumentBuilder { ArgumentBuilder::new(Argument::new(name, Rc::new(parser)).into()) } diff --git a/azalea-brigadier/src/command_dispatcher.rs b/azalea-brigadier/src/command_dispatcher.rs index ea788130..fc3f3d50 100644 --- a/azalea-brigadier/src/command_dispatcher.rs +++ b/azalea-brigadier/src/command_dispatcher.rs @@ -301,8 +301,8 @@ impl Clone for CommandDispatcher { mod tests { use super::*; use crate::{ + arguments::integer_argument_type::integer, builder::{literal_argument_builder::literal, required_argument_builder::argument}, - parsers::integer, }; #[derive(Debug, PartialEq)] diff --git a/azalea-brigadier/src/lib.rs b/azalea-brigadier/src/lib.rs index cffaac12..db46d46e 100644 --- a/azalea-brigadier/src/lib.rs +++ b/azalea-brigadier/src/lib.rs @@ -1,3 +1,4 @@ +pub mod arguments; pub mod builder; pub mod command_dispatcher; pub mod context; @@ -5,7 +6,6 @@ pub mod exceptions; pub mod message; pub mod modifier; pub mod parse_results; -pub mod parsers; pub mod string_reader; pub mod tree; @@ -15,10 +15,10 @@ mod tests { use std::rc::Rc; use crate::{ + arguments::integer_argument_type::{get_integer, integer}, builder::{literal_argument_builder::literal, required_argument_builder::argument}, command_dispatcher::CommandDispatcher, context::CommandContext, - parsers::{get_integer, integer}, }; struct CommandSourceStack { diff --git a/azalea-brigadier/src/parsers.rs b/azalea-brigadier/src/parsers.rs deleted file mode 100644 index 18ee9119..00000000 --- a/azalea-brigadier/src/parsers.rs +++ /dev/null @@ -1,56 +0,0 @@ -use std::{any::Any, rc::Rc}; - -use crate::{ - context::CommandContext, - exceptions::{BuiltInExceptions, CommandSyntaxException}, - string_reader::StringReader, -}; - -pub trait Parser { - fn parse(&self, reader: &mut StringReader) -> Result, CommandSyntaxException>; -} - -#[derive(Default)] -struct Integer { - pub minimum: Option, - pub maximum: Option, -} - -impl Parser for Integer { - fn parse(&self, reader: &mut StringReader) -> Result, CommandSyntaxException> { - let start = reader.cursor; - let result = reader.read_int()?; - if let Some(minimum) = self.minimum { - if result < minimum { - reader.cursor = start; - return Err(BuiltInExceptions::IntegerTooSmall { - found: result, - min: minimum, - } - .create_with_context(reader)); - } - } - if let Some(maximum) = self.maximum { - if result > maximum { - reader.cursor = start; - return Err(BuiltInExceptions::IntegerTooBig { - found: result, - max: maximum, - } - .create_with_context(reader)); - } - } - Ok(Rc::new(result)) - } -} - -pub fn integer() -> impl Parser { - Integer::default() -} -pub fn get_integer(context: &CommandContext, name: &str) -> Option { - context - .argument(name) - .unwrap() - .downcast_ref::() - .copied() -} -- cgit v1.2.3