macro_rules! edn { ($($edn:tt)+) => { ... }; }
Expand description
Macro to parse EDN
into Rust Spec
#![recursion_limit="512"] // recommended recursion size
#[macro_use]
extern crate edn_rs;
use edn_rs::edn::{Edn, List, Set, Map};
fn main() {
let list = edn!((1 1.2 3 false :f nil 3/4));
let expected = Edn::List(
List::new(
vec![
Edn::Int(1),
Edn::Double(1.2.into()),
Edn::Int(3),
Edn::Bool(false),
Edn::Key(":f".to_string()),
Edn::Nil,
Edn::Rational("3/4".to_string())
]
)
);
assert_eq!(list, expected);
let set = edn!(#{1 1.2 3 false :f nil 3/4});
let expected = Edn::Set(
Set::new(
set!{
Edn::Int(1),
Edn::Double(1.2.into()),
Edn::Int(3),
Edn::Bool(false),
Edn::Key(":f".to_string()),
Edn::Nil,
Edn::Rational("3/4".to_string())
}
)
);
assert_eq!(set, expected);
let map = edn!({1.2 false, :b 3/4});
let expected = Edn::Map(
Map::new(
map!{
String::from("1.2") => Edn::Bool(false),
// Note `:b` becomes `b`
String::from(":b") => Edn::Rational(String::from("3/4"))
}
)
);
assert_eq!(map, expected);
}
A more complete example:
#[macro_use]
extern crate edn_rs;
use edn_rs::edn::{Edn, List, Vector, Map};
fn main() {
let expected = Edn::List(
List::new(
vec![
Edn::Int(1),
Edn::Double(1.2.into()),
Edn::Int(3),
Edn::Map(
Map::new( map![
String::from("false") => Edn::Map(
Map::new( map![
String::from(":f") => Edn::Key(String::from(":b"))
])),
String::from("nil") => Edn::Vector(
Vector::new( vec![
Edn::Rational("3/4".to_string()),
Edn::Int(1i64)
]))
]))
]
)
);
assert_eq!(edn!(( 1 1.2 3 {false {:f :b} nil [3/4 1]})), expected);
}
To navigate through Edn
data you can just use get
and get_mut
:
#[macro_use]
extern crate edn_rs;
use edn_rs::edn::{Edn, Map, Vector};
fn main() {
let edn = edn!([ 1 1.2 3 {false :f nil 3/4}]);
assert_eq!(edn[1], edn!(1.2));
assert_eq!(edn[1], Edn::Double(1.2f64.into()));
assert_eq!(edn[3]["false"], edn!(:f));
assert_eq!(edn[3]["false"], Edn::Key(":f".to_string()));
}
Internal implementation is hidden, please look at source.