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
extern crate regex;

pub mod edn;
mod utils;

use edn::EdnNode;

/// `parse_edn` receives a String with the EDN context and transforms it in a EdnNode`
/// 
/// ```rust
/// let edn = String::from("[1 2 [:3 \"4\"]]");
/// let value = parse_edn(edn);
/// ```
/// 
/// A response for value is: 
/// ```
/// EdnNode {
///    value: String::from("["),
///    edntype: EdnType::Vector,
///    internal: Some(vec![
///        EdnNode {
///            value: String::from("1"),
///            edntype: EdnType::Int,
///            internal: None,
///        },
///        EdnNode {
///            value: String::from("2"),
///            edntype: EdnType::Int,
///            internal: None,
///        },
///        EdnNode {
///            value: String::from("["),
///            edntype: EdnType::Vector,
///            internal: Some(vec![
///                EdnNode {
///                    value: String::from(":3"),
///                    edntype: EdnType::Key,
///                    internal: None,
///                },
///                EdnNode {
///                    value: String::from("\"4\""),
///                    edntype: EdnType::Str,
///                    internal: None,
///                },
///                EdnNode {
///                    value: String::from("]"),
///                    edntype: EdnType::VectorClose,
///                    internal: None,
///                },
///            ]),
///        },
///        EdnNode {
///            value: String::from("]"),
///            edntype: EdnType::VectorClose,
///            internal: None,
///        },
///    ]),
///  };
/// ```
pub fn parse_edn(edn: String) -> EdnNode {
    let mut end_tokens = utils::tokenize_edn(edn);

    if end_tokens.is_empty() {
        return EdnNode::nil();
    }

    utils::ednify(end_tokens.remove(0), &mut end_tokens)
}