1 //! Ignore float-parsing data interface.
2 
3 use crate::util::*;
4 use super::exponent::*;
5 use super::traits::*;
6 use super::trim::*;
7 use super::validate::*;
8 
9 // Ignore data interface for fast float parsers.
10 //
11 // Guaranteed to parse `NumberFormat::ignore(digit_separator)`.
12 //
13 // The requirements:
14 //     1). Must contain significant digits.
15 data_interface!(
16     struct IgnoreFastDataInterface,
17     struct IgnoreSlowDataInterface,
18     fields => {
19         format: NumberFormat,
20     },
21     integer_iter => (IteratorSeparator, iterate_digits_ignore_separator),
22     fraction_iter => (IteratorSeparator, iterate_digits_ignore_separator),
23     exponent_iter => (IteratorSeparator, iterate_digits_ignore_separator),
24     format => |this: &Self| this.format,
25     consume_integer_digits => consume_digits_ignore_separator,
26     consume_fraction_digits => consume_digits_ignore_separator,
27     extract_exponent => extract_exponent_ignore_separator,
28     validate_mantissa => validate_permissive_mantissa,
29     validate_exponent => validate_optional_exponent,
30     validate_exponent_fraction => validate_exponent_optional_fraction,
31     validate_exponent_sign => validate_optional_exponent_sign,
32     ltrim_zero => ltrim_zero_separator,
33     ltrim_separator => ltrim_separator_separator,
34     rtrim_zero => rtrim_zero_separator,
35     rtrim_separator => rtrim_separator_separator,
36     new => fn new(format: NumberFormat) -> Self {
37         Self {
38             format,
39             integer: &[],
40             fraction: None,
41             exponent: None,
42             raw_exponent: 0
43         }
44     }
45 );
46 
47 // TESTS
48 // -----
49 
50 #[cfg(test)]
51 mod tests {
52     use super::*;
53 
54     macro_rules! ignore {
55         ($integer:expr, $fraction:expr, $exponent:expr, $raw_exponent:expr) => {
56             IgnoreFastDataInterface {
57                 format: NumberFormat::ignore(b'_').unwrap(),
58                 integer: $integer,
59                 fraction: $fraction,
60                 exponent: $exponent,
61                 raw_exponent: $raw_exponent
62             }
63         };
64     }
65 
66     #[test]
extract_test()67     fn extract_test() {
68         IgnoreFastDataInterface::new(NumberFormat::ignore(b'_').unwrap()).run_tests([
69             // Valid
70             ("1.2345", Ok(ignore!(b"1", Some(b!("2345")), None, 0))),
71             ("12.345", Ok(ignore!(b"12", Some(b!("345")), None, 0))),
72             ("12345.6789", Ok(ignore!(b"12345", Some(b!("6789")), None, 0))),
73             ("1.2345e10", Ok(ignore!(b"1", Some(b!("2345")), Some(b!("10")), 10))),
74             ("1.2345e+10", Ok(ignore!(b"1", Some(b!("2345")), Some(b!("+10")), 10))),
75             ("1.2345e-10", Ok(ignore!(b"1", Some(b!("2345")), Some(b!("-10")), -10))),
76             ("100000000000000000000", Ok(ignore!(b"100000000000000000000", None, None, 0))),
77             ("100000000000000000001", Ok(ignore!(b"100000000000000000001", None, None, 0))),
78             ("179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497791.9999999999999999999999999999999999999999999999999999999999999999999999", Ok(ignore!(b"179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497791", Some(b!("9999999999999999999999999999999999999999999999999999999999999999999999")), None, 0))),
79             ("1009e-31", Ok(ignore!(b"1009", None, Some(b!("-31")), -31))),
80             ("001.0", Ok(ignore!(b"1", Some(b!("")), None, 0))),
81             ("1.", Ok(ignore!(b"1", Some(b!("")), None, 0))),
82             ("12.", Ok(ignore!(b"12", Some(b!("")), None, 0))),
83             ("1234567.", Ok(ignore!(b"1234567", Some(b!("")), None, 0))),
84             (".1", Ok(ignore!(b"", Some(b!("1")), None, 0))),
85             (".12", Ok(ignore!(b"", Some(b!("12")), None, 0))),
86             (".1234567", Ok(ignore!(b"", Some(b!("1234567")), None, 0))),
87             ("1.2345e", Ok(ignore!(b"1", Some(b!("2345")), Some(b!("")), 0))),
88             (".3e", Ok(ignore!(b"", Some(b!("3")), Some(b!("")), 0))),
89             ("_1.2345_e_+_10", Ok(ignore!(b"1", Some(b!("2345")), Some(b!("_+_10")), 10))),
90             ("12__1_._23__45e+1__0_", Ok(ignore!(b"12__1_", Some(b!("_23__45")), Some(b!("+1__0_")), 10))),
91 
92             // Invalid
93             ("", Err(ErrorCode::EmptyMantissa)),
94             ("+", Err(ErrorCode::EmptyMantissa)),
95             ("-", Err(ErrorCode::EmptyMantissa)),
96             (".", Err(ErrorCode::EmptyMantissa)),
97             ("+.", Err(ErrorCode::EmptyMantissa)),
98             ("-.", Err(ErrorCode::EmptyMantissa)),
99             ("e", Err(ErrorCode::EmptyMantissa)),
100             ("E", Err(ErrorCode::EmptyMantissa)),
101             ("e1", Err(ErrorCode::EmptyMantissa)),
102             ("e+1", Err(ErrorCode::EmptyMantissa)),
103             ("e-1", Err(ErrorCode::EmptyMantissa)),
104             (".e", Err(ErrorCode::EmptyMantissa)),
105             (".E", Err(ErrorCode::EmptyMantissa)),
106             (".e1", Err(ErrorCode::EmptyMantissa)),
107             (".e+1", Err(ErrorCode::EmptyMantissa)),
108             (".e-1", Err(ErrorCode::EmptyMantissa)),
109         ].iter());
110     }
111 }
112