diff options
| author | mat <github@matdoes.dev> | 2022-04-18 19:38:08 -0500 |
|---|---|---|
| committer | mat <github@matdoes.dev> | 2022-04-18 19:38:08 -0500 |
| commit | b8ceb56e7141320d5ba23a946fe3eceee43f51f5 (patch) | |
| tree | 6cabb2ec6b47a0f6da26919869f839c1aa343978 /azalea-brigadier/src/arguments | |
| parent | 8d71fbf813391783531a9f7c70e75e105fabaf03 (diff) | |
| download | azalea-drasl-b8ceb56e7141320d5ba23a946fe3eceee43f51f5.tar.xz | |
move `parsers` into `arguments`
Diffstat (limited to 'azalea-brigadier/src/arguments')
| -rw-r--r-- | azalea-brigadier/src/arguments/argument_type.rs | 7 | ||||
| -rw-r--r-- | azalea-brigadier/src/arguments/integer_argument_type.rs | 54 | ||||
| -rw-r--r-- | azalea-brigadier/src/arguments/mod.rs | 4 |
3 files changed, 65 insertions, 0 deletions
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<Rc<dyn Any>, 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<i32>, + pub maximum: Option<i32>, +} + +impl ArgumentType for Integer { + fn parse(&self, reader: &mut StringReader) -> Result<Rc<dyn Any>, 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<S>(context: &CommandContext<S>, name: &str) -> Option<i32> { + context + .argument(name) + .unwrap() + .downcast_ref::<i32>() + .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; |
