aboutsummaryrefslogtreecommitdiff
path: root/azalea-brigadier/src/exceptions
diff options
context:
space:
mode:
authormat <github@matdoes.dev>2022-04-24 17:37:57 -0500
committermat <github@matdoes.dev>2022-04-24 17:37:57 -0500
commit3e507f0db4020eaf406ba69aae3d4dc1301d29ac (patch)
treeca6c127c9db6dfd14511e98944fc031fe5f1e43a /azalea-brigadier/src/exceptions
parent9f576c5600ba9a244bc0d433bb7de174284066a2 (diff)
parentb7641ff308aab7840d2a2253ae50f8ee496b2a97 (diff)
downloadazalea-drasl-3e507f0db4020eaf406ba69aae3d4dc1301d29ac.tar.xz
Merge branch 'main' into auth
Diffstat (limited to 'azalea-brigadier/src/exceptions')
-rwxr-xr-xazalea-brigadier/src/exceptions/builtin_exceptions.rs159
-rwxr-xr-xazalea-brigadier/src/exceptions/command_syntax_exception.rs91
-rwxr-xr-xazalea-brigadier/src/exceptions/mod.rs5
3 files changed, 255 insertions, 0 deletions
diff --git a/azalea-brigadier/src/exceptions/builtin_exceptions.rs b/azalea-brigadier/src/exceptions/builtin_exceptions.rs
new file mode 100755
index 00000000..09951a03
--- /dev/null
+++ b/azalea-brigadier/src/exceptions/builtin_exceptions.rs
@@ -0,0 +1,159 @@
+use std::fmt;
+
+use crate::{message::Message, string_reader::StringReader};
+
+use super::command_syntax_exception::CommandSyntaxException;
+
+#[derive(Clone, PartialEq)]
+pub enum BuiltInExceptions {
+ DoubleTooSmall { found: f64, min: f64 },
+ DoubleTooBig { found: f64, max: f64 },
+
+ FloatTooSmall { found: f32, min: f32 },
+ FloatTooBig { found: f32, max: f32 },
+
+ IntegerTooSmall { found: i32, min: i32 },
+ IntegerTooBig { found: i32, max: i32 },
+
+ LongTooSmall { found: i64, min: i64 },
+ LongTooBig { found: i64, max: i64 },
+
+ LiteralIncorrect { expected: String },
+
+ ReaderExpectedStartOfQuote,
+ ReaderExpectedEndOfQuote,
+ ReaderInvalidEscape { character: char },
+ ReaderInvalidBool { value: String },
+ ReaderInvalidInt { value: String },
+ ReaderExpectedInt,
+ ReaderInvalidLong { value: String },
+ ReaderExpectedLong,
+ ReaderInvalidDouble { value: String },
+ ReaderExpectedDouble,
+ ReaderInvalidFloat { value: String },
+ ReaderExpectedFloat,
+ ReaderExpectedBool,
+ ReaderExpectedSymbol { symbol: char },
+
+ DispatcherUnknownCommand,
+ DispatcherUnknownArgument,
+ DispatcherExpectedArgumentSeparator,
+ DispatcherParseException { message: String },
+}
+
+impl fmt::Debug for BuiltInExceptions {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ BuiltInExceptions::DoubleTooSmall { found, min } => {
+ write!(f, "Double must not be less than {}, found {}", min, found)
+ }
+ BuiltInExceptions::DoubleTooBig { found, max } => {
+ write!(f, "Double must not be more than {}, found {}", max, found)
+ }
+
+ BuiltInExceptions::FloatTooSmall { found, min } => {
+ write!(f, "Float must not be less than {}, found {}", min, found)
+ }
+ BuiltInExceptions::FloatTooBig { found, max } => {
+ write!(f, "Float must not be more than {}, found {}", max, found)
+ }
+
+ BuiltInExceptions::IntegerTooSmall { found, min } => {
+ write!(f, "Integer must not be less than {}, found {}", min, found)
+ }
+ BuiltInExceptions::IntegerTooBig { found, max } => {
+ write!(f, "Integer must not be more than {}, found {}", max, found)
+ }
+
+ BuiltInExceptions::LongTooSmall { found, min } => {
+ write!(f, "Long must not be less than {}, found {}", min, found)
+ }
+ BuiltInExceptions::LongTooBig { found, max } => {
+ write!(f, "Long must not be more than {}, found {}", max, found)
+ }
+
+ BuiltInExceptions::LiteralIncorrect { expected } => {
+ write!(f, "Expected literal {}", expected)
+ }
+
+ BuiltInExceptions::ReaderExpectedStartOfQuote => {
+ write!(f, "Expected quote to start a string")
+ }
+ BuiltInExceptions::ReaderExpectedEndOfQuote => {
+ write!(f, "Unclosed quoted string")
+ }
+ BuiltInExceptions::ReaderInvalidEscape { character } => {
+ write!(
+ f,
+ "Invalid escape sequence '{}' in quoted string",
+ character
+ )
+ }
+ BuiltInExceptions::ReaderInvalidBool { value } => {
+ write!(
+ f,
+ "Invalid bool, expected true or false but found '{}'",
+ value
+ )
+ }
+ BuiltInExceptions::ReaderInvalidInt { value } => {
+ write!(f, "Invalid Integer '{}'", value)
+ }
+ BuiltInExceptions::ReaderExpectedInt => {
+ write!(f, "Expected Integer")
+ }
+ BuiltInExceptions::ReaderInvalidLong { value } => {
+ write!(f, "Invalid long '{}'", value)
+ }
+ BuiltInExceptions::ReaderExpectedLong => {
+ write!(f, "Expected long")
+ }
+ BuiltInExceptions::ReaderInvalidDouble { value } => {
+ write!(f, "Invalid double '{}'", value)
+ }
+ BuiltInExceptions::ReaderExpectedDouble => {
+ write!(f, "Expected double")
+ }
+ BuiltInExceptions::ReaderInvalidFloat { value } => {
+ write!(f, "Invalid Float '{}'", value)
+ }
+ BuiltInExceptions::ReaderExpectedFloat => {
+ write!(f, "Expected Float")
+ }
+ BuiltInExceptions::ReaderExpectedBool => {
+ write!(f, "Expected bool")
+ }
+ BuiltInExceptions::ReaderExpectedSymbol { symbol } => {
+ write!(f, "Expected '{}'", symbol)
+ }
+
+ BuiltInExceptions::DispatcherUnknownCommand => {
+ write!(f, "Unknown command")
+ }
+ BuiltInExceptions::DispatcherUnknownArgument => {
+ write!(f, "Incorrect argument for command")
+ }
+ BuiltInExceptions::DispatcherExpectedArgumentSeparator => {
+ write!(
+ f,
+ "Expected whitespace to end one argument, but found trailing data"
+ )
+ }
+ BuiltInExceptions::DispatcherParseException { message } => {
+ write!(f, "Could not parse command: {}", message)
+ }
+ }
+ }
+}
+
+impl BuiltInExceptions {
+ pub fn create(self) -> CommandSyntaxException {
+ let message = Message::from(format!("{:?}", self));
+ CommandSyntaxException::create(self, message)
+ }
+
+ pub fn create_with_context(self, reader: &StringReader) -> CommandSyntaxException {
+ let message = Message::from(format!("{:?}", self));
+ CommandSyntaxException::new(self, message, reader.string(), reader.cursor())
+ }
+}
diff --git a/azalea-brigadier/src/exceptions/command_syntax_exception.rs b/azalea-brigadier/src/exceptions/command_syntax_exception.rs
new file mode 100755
index 00000000..4bfe9cda
--- /dev/null
+++ b/azalea-brigadier/src/exceptions/command_syntax_exception.rs
@@ -0,0 +1,91 @@
+use std::{cmp, fmt};
+
+use super::builtin_exceptions::BuiltInExceptions;
+use crate::message::Message;
+
+#[derive(Clone, PartialEq)]
+pub struct CommandSyntaxException {
+ pub type_: BuiltInExceptions,
+ message: Message,
+ input: Option<String>,
+ cursor: Option<usize>,
+}
+
+const CONTEXT_AMOUNT: usize = 10;
+
+impl CommandSyntaxException {
+ pub fn new(type_: BuiltInExceptions, message: Message, input: &str, cursor: usize) -> Self {
+ Self {
+ type_,
+ message,
+ input: Some(input.to_string()),
+ cursor: Some(cursor),
+ }
+ }
+
+ pub fn create(type_: BuiltInExceptions, message: Message) -> Self {
+ Self {
+ type_,
+ message,
+ input: None,
+ cursor: None,
+ }
+ }
+
+ pub fn message(&self) -> String {
+ let mut message = self.message.string();
+ let context = self.context();
+ if let Some(context) = context {
+ message.push_str(&format!(
+ " at position {}: {}",
+ self.cursor.unwrap_or(usize::MAX),
+ context
+ ));
+ }
+ message
+ }
+
+ pub fn raw_message(&self) -> &Message {
+ &self.message
+ }
+
+ pub fn context(&self) -> Option<String> {
+ if let Some(input) = &self.input {
+ if let Some(cursor) = self.cursor {
+ let mut builder = String::new();
+ let cursor = cmp::min(input.len(), cursor);
+
+ if cursor > CONTEXT_AMOUNT {
+ builder.push_str("...");
+ }
+
+ builder.push_str(
+ &input
+ [(cmp::max(0, cursor as isize - CONTEXT_AMOUNT as isize) as usize)..cursor],
+ );
+ builder.push_str("<--[HERE]");
+
+ return Some(builder);
+ }
+ }
+ None
+ }
+
+ pub fn get_type(&self) -> &BuiltInExceptions {
+ &self.type_
+ }
+
+ pub fn input(&self) -> &Option<String> {
+ &self.input
+ }
+
+ pub fn cursor(&self) -> Option<usize> {
+ self.cursor
+ }
+}
+
+impl fmt::Debug for CommandSyntaxException {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "{}", self.message())
+ }
+}
diff --git a/azalea-brigadier/src/exceptions/mod.rs b/azalea-brigadier/src/exceptions/mod.rs
new file mode 100755
index 00000000..6b9c8d62
--- /dev/null
+++ b/azalea-brigadier/src/exceptions/mod.rs
@@ -0,0 +1,5 @@
+mod builtin_exceptions;
+mod command_syntax_exception;
+
+pub use builtin_exceptions::BuiltInExceptions;
+pub use command_syntax_exception::CommandSyntaxException;