1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
use proc_macro2::Span; #[allow(unused_imports)] use standback::prelude::*; use std::{ fmt::{Debug, Display}, ops::RangeBounds, str::FromStr, }; use syn::{LitInt, Result}; pub(crate) trait LitIntExtension { fn create<T: Display>(value: T) -> Self; fn with_span(self, span: Span) -> Self; fn ensure_in_range(&self, range: impl RangeBounds<isize> + Debug) -> Result<()>; fn value<T: FromStr + Display>(&self) -> Result<T> where T::Err: Display; } impl LitIntExtension for LitInt { fn create<T: Display>(value: T) -> Self { Self::new(&value.to_string(), Span::call_site()) } fn with_span(mut self, span: Span) -> Self { self.set_span(span); self } #[allow(unstable_name_collisions)] fn ensure_in_range(&self, range: impl RangeBounds<isize> + Debug) -> Result<()> { if range.contains(&self.value()?) { Ok(()) } else { error!(self.span(), "value must be in range {:?}", range) } } fn value<T: FromStr + Display>(&self) -> Result<T> where T::Err: Display, { match self.base10_parse() { Ok(value) => Ok(value), Err(e) => error!(self.span(), "{}", e), } } }