Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/mbe/src/lib.rs')
-rw-r--r--crates/mbe/src/lib.rs21
1 files changed, 21 insertions, 0 deletions
diff --git a/crates/mbe/src/lib.rs b/crates/mbe/src/lib.rs
index 80352aa4ad..5ef20ff8a9 100644
--- a/crates/mbe/src/lib.rs
+++ b/crates/mbe/src/lib.rs
@@ -19,6 +19,7 @@ mod benchmark;
mod token_map;
use ::tt::token_id as tt;
+use stdx::impl_from;
use std::fmt;
@@ -77,8 +78,11 @@ pub enum ExpandError {
LimitExceeded,
NoMatchingRule,
UnexpectedToken,
+ CountError(CountError),
}
+impl_from!(CountError for ExpandError);
+
impl ExpandError {
fn binding_error(e: impl Into<Box<str>>) -> ExpandError {
ExpandError::BindingError(Box::new(e.into()))
@@ -94,6 +98,23 @@ impl fmt::Display for ExpandError {
ExpandError::ConversionError => f.write_str("could not convert tokens"),
ExpandError::LimitExceeded => f.write_str("Expand exceed limit"),
ExpandError::LeftoverTokens => f.write_str("leftover tokens"),
+ ExpandError::CountError(e) => e.fmt(f),
+ }
+ }
+}
+
+// FIXME: Showing these errors could be nicer.
+#[derive(Debug, PartialEq, Eq, Clone, Hash)]
+pub enum CountError {
+ OutOfBounds,
+ Misplaced,
+}
+
+impl fmt::Display for CountError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ CountError::OutOfBounds => f.write_str("${count} out of bounds"),
+ CountError::Misplaced => f.write_str("${count} misplaced"),
}
}
}