1use std::collections::BTreeMap;
2
3use nom::{
4 bytes::complete::take_while, character::complete::char, character::is_space,
5 multi::separated_list0, sequence::delimited, IResult,
6};
7
8pub type Record = BTreeMap<Xattr, Value>;
9
10pub fn space(i: &[u8]) -> IResult<&[u8], &[u8]> {
11 take_while(move |x| is_space(x))(i)
12}
13
14pub fn array(i: &[u8]) -> IResult<&[u8], Vec<Value>> {
15 delimited(
16 char('['),
17 separated_list0(
18 char(','),
19 delimited(space, parse_value_not_all_consuming, space),
20 ),
21 char(']'),
22 )(i)
23}
24
25#[test]
26fn test_array() {
27 assert_eq!(
28 array(b"[1,2,3,4]".as_slice()),
29 Ok((
30 b"".as_slice(),
31 vec![1f64, 2f64, 3f64, 4f64]
32 .into_iter()
33 .map(Value::from)
34 .collect()
35 ))
36 );
37 assert_eq!(
38 array(b"[ 1 ,2 , 3, A, \"B\" ,\"C\",Defg]"),
39 Ok((
40 b"".as_slice(),
41 vec![
42 Value::from(1f64),
43 Value::from(2f64),
44 Value::from(3f64),
45 Value::from("A"),
46 Value::from("B"),
47 Value::from("C"),
48 Value::from("Defg")
49 ]
50 ))
51 );
52}
53
54mod assignment;
55mod key;
56mod predicate;
57mod relation;
58mod value;
59mod xattr;
60
61pub use assignment::*;
62pub use key::*;
63pub use predicate::*;
64pub use relation::*;
65pub use value::*;
66pub use xattr::*;