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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
use std::fmt::Debug; use num::BigUint; use erl_tokenize::tokens::{AtomToken, CharToken, FloatToken, IntegerToken, KeywordToken, StringToken, SymbolToken, VariableToken}; use erl_tokenize::values::{Symbol, Keyword}; use {Result, ErrorKind}; pub trait Expect: Sized { type Value: ?Sized + Debug; fn expect(&self, expected: &Self::Value) -> Result<()>; } impl Expect for AtomToken { type Value = str; fn expect(&self, expected: &Self::Value) -> Result<()> { track_assert_eq!(self.value(), expected, ErrorKind::InvalidInput); Ok(()) } } impl Expect for CharToken { type Value = char; fn expect(&self, expected: &Self::Value) -> Result<()> { track_assert_eq!(self.value(), *expected, ErrorKind::InvalidInput); Ok(()) } } impl Expect for FloatToken { type Value = f64; fn expect(&self, expected: &Self::Value) -> Result<()> { use std::f64; track_assert!( (self.value() - *expected).abs() < f64::EPSILON, ErrorKind::InvalidInput ); Ok(()) } } impl Expect for IntegerToken { type Value = BigUint; fn expect(&self, expected: &Self::Value) -> Result<()> { track_assert_eq!(self.value(), expected, ErrorKind::InvalidInput); Ok(()) } } impl Expect for KeywordToken { type Value = Keyword; fn expect(&self, expected: &Self::Value) -> Result<()> { track_assert_eq!(self.value(), *expected, ErrorKind::InvalidInput); Ok(()) } } impl Expect for StringToken { type Value = str; fn expect(&self, expected: &Self::Value) -> Result<()> { track_assert_eq!(self.value(), expected, ErrorKind::InvalidInput); Ok(()) } } impl Expect for SymbolToken { type Value = Symbol; fn expect(&self, expected: &Self::Value) -> Result<()> { track_assert_eq!(self.value(), *expected, ErrorKind::InvalidInput); Ok(()) } } impl Expect for VariableToken { type Value = str; fn expect(&self, expected: &Self::Value) -> Result<()> { track_assert_eq!(self.value(), expected, ErrorKind::InvalidInput); Ok(()) } }