From 36395c7437218b86c832cc041f7a58f325a007bb Mon Sep 17 00:00:00 2001 From: SoniEx2 Date: Sat, 4 Dec 2021 17:46:00 -0300 Subject: Add integer and float arguments --- tests/common/errorfunc.rs | 66 ++++++++++++++++++++++++++++++++++++++++++++-- tests/common/errorpanic.rs | 21 +++++++++++++-- 2 files changed, 83 insertions(+), 4 deletions(-) (limited to 'tests/common') diff --git a/tests/common/errorfunc.rs b/tests/common/errorfunc.rs index 926c94c..5fb5fb6 100644 --- a/tests/common/errorfunc.rs +++ b/tests/common/errorfunc.rs @@ -4,8 +4,11 @@ // Documentation and comments licensed under CC BY-SA 4.0. use ::std::marker::PhantomData; +use ::std::ops::Bound; +use ::std::ops::RangeBounds; -use ::iosonism::strcursor::ReadError; +use ::iosonism::error::RangeError; +use ::iosonism::error::ReadError; use ::iosonism::strcursor::StringReader; /// An error callback. @@ -17,7 +20,7 @@ pub trait ErrorFunc<'a, C: StringReader<'a>> { pub struct ErrorCall(PhantomData); #[non_exhaustive] -#[derive(PartialEq, Eq, Debug)] +#[derive(PartialEq, Debug)] pub enum ErrorType<'a> { InvalidInteger(&'a str), ExpectedInteger, @@ -29,6 +32,17 @@ pub enum ErrorType<'a> { ExpectedEndOfQuote, InvalidEscape(&'a str), ExpectedSymbol(&'a str), + RangeErrori32(RangeErrorT), + RangeErrori64(RangeErrorT), + RangeErrorf32(RangeErrorT), + RangeErrorf64(RangeErrorT), +} + +#[derive(PartialEq, Debug)] +pub struct RangeErrorT { + pub value: T, + pub start: Bound, + pub end: Bound, } impl ::std::fmt::Display for ErrorCall { @@ -46,6 +60,54 @@ impl ::std::fmt::Debug for ErrorCall { impl ::std::error::Error for ErrorCall { } +impl<'a, C, R, T> RangeError<'a, C, i32, R> for ErrorCall +where C: StringReader<'a>, R: RangeBounds, T: ErrorFunc<'a, C> { + fn value_not_in_range(context: &C, from: &i32, range: &R) -> Self { + T::call(context, ErrorType::RangeErrori32(RangeErrorT { + value: *from, + start: range.start_bound().cloned(), + end: range.end_bound().cloned(), + })); + Self(PhantomData) + } +} + +impl<'a, C, R, T> RangeError<'a, C, i64, R> for ErrorCall +where C: StringReader<'a>, R: RangeBounds, T: ErrorFunc<'a, C> { + fn value_not_in_range(context: &C, from: &i64, range: &R) -> Self { + T::call(context, ErrorType::RangeErrori64(RangeErrorT { + value: *from, + start: range.start_bound().cloned(), + end: range.end_bound().cloned(), + })); + Self(PhantomData) + } +} + +impl<'a, C, R, T> RangeError<'a, C, f32, R> for ErrorCall +where C: StringReader<'a>, R: RangeBounds, T: ErrorFunc<'a, C> { + fn value_not_in_range(context: &C, from: &f32, range: &R) -> Self { + T::call(context, ErrorType::RangeErrorf32(RangeErrorT { + value: *from, + start: range.start_bound().cloned(), + end: range.end_bound().cloned(), + })); + Self(PhantomData) + } +} + +impl<'a, C, R, T> RangeError<'a, C, f64, R> for ErrorCall +where C: StringReader<'a>, R: RangeBounds, T: ErrorFunc<'a, C> { + fn value_not_in_range(context: &C, from: &f64, range: &R) -> Self { + T::call(context, ErrorType::RangeErrorf64(RangeErrorT { + value: *from, + start: range.start_bound().cloned(), + end: range.end_bound().cloned(), + })); + Self(PhantomData) + } +} + impl<'a, C: StringReader<'a>, T> ReadError<'a, C> for ErrorCall where T: ErrorFunc<'a, C> { fn invalid_integer(context: &C, from: &str) -> Self { diff --git a/tests/common/errorpanic.rs b/tests/common/errorpanic.rs index faef603..6b4254b 100644 --- a/tests/common/errorpanic.rs +++ b/tests/common/errorpanic.rs @@ -3,11 +3,12 @@ // Licensed under the MIT license. // Documentation and comments licensed under CC BY-SA 4.0. -use ::iosonism::strcursor::ReadError; +use ::iosonism::error::RangeError; +use ::iosonism::error::ReadError; use ::iosonism::strcursor::StringReader; /// An implementation of various Iosonism errors that just panics. -#[derive(Debug)] +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum ErrorPanic { // uninhabitable! } @@ -22,6 +23,22 @@ impl ::std::fmt::Display for ErrorPanic { impl ::std::error::Error for ErrorPanic { } +impl<'a, C, T, R> RangeError<'a, C, T, R> for ErrorPanic +where C: StringReader<'a>, T: ::std::fmt::Display, R: ::std::fmt::Debug { + fn value_not_in_range(context: &C, from: &T, range: &R) -> Self { + if !context.get_remaining().is_empty() { + panic!( + "value ({}) not in range: {:?} at ...{}", + from, + range, + context.get_remaining(), + ); + } else { + panic!("value ({}) not in range: {:?}", from, range); + } + } +} + impl<'a, C: StringReader<'a>> ReadError<'a, C> for ErrorPanic { fn invalid_integer(context: &C, from: &str) -> Self { if !context.get_remaining().is_empty() { -- cgit 1.4.1