File: complete_float.rs

package info (click to toggle)
rust-nom-4 4.2.3-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 820 kB
  • sloc: makefile: 2
file content (80 lines) | stat: -rw-r--r-- 1,777 bytes parent folder | download | duplicates (4)
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
73
74
75
76
77
78
79
80
#[macro_use]
extern crate nom;

use nom::digit;
use nom::types::CompleteStr;

#[macro_export]
macro_rules! complete_named (
  ($name:ident, $submac:ident!( $($args:tt)* )) => (
    fn $name( i: CompleteStr ) -> nom::IResult<CompleteStr, CompleteStr, u32> {
      $submac!(i, $($args)*)
    }
  );
  ($name:ident<$o:ty>, $submac:ident!( $($args:tt)* )) => (
    fn $name( i: CompleteStr ) -> nom::IResult<CompleteStr, $o, u32> {
      $submac!(i, $($args)*)
    }
  );
);

complete_named!(
  unsigned_float<f32>,
  flat_map!(
    recognize!(alt!(
      delimited!(digit, tag!("."), opt!(digit)) | delimited!(opt!(digit), tag!("."), digit)
    )),
    parse_to!(f32)
  )
);

complete_named!(
  float<f32>,
  map!(
    pair!(opt!(alt!(tag!("+") | tag!("-"))), unsigned_float),
    |(sign, value): (Option<CompleteStr>, f32)| sign
      .and_then(|s| s.0.chars().next())
      .and_then(|c| if c == '-' { Some(-1f32) } else { None })
      .unwrap_or(1f32) * value
  )
);

#[test]
fn unsigned_float_test() {
  assert_eq!(
    unsigned_float(CompleteStr("123.456")),
    Ok((CompleteStr(""), 123.456))
  );
  assert_eq!(
    unsigned_float(CompleteStr("0.123")),
    Ok((CompleteStr(""), 0.123))
  );
  assert_eq!(
    unsigned_float(CompleteStr("123.0")),
    Ok((CompleteStr(""), 123.0))
  );
  assert_eq!(
    unsigned_float(CompleteStr("123.")),
    Ok((CompleteStr(""), 123.0))
  );
  assert_eq!(
    unsigned_float(CompleteStr(".123")),
    Ok((CompleteStr(""), 0.123))
  );
}

#[test]
fn float_test() {
  assert_eq!(
    float(CompleteStr("123.456")),
    Ok((CompleteStr(""), 123.456))
  );
  assert_eq!(
    float(CompleteStr("+123.456")),
    Ok((CompleteStr(""), 123.456))
  );
  assert_eq!(
    float(CompleteStr("-123.456")),
    Ok((CompleteStr(""), -123.456))
  );
}