Near Stable
Crate to parse and emit EDN
* This lib does not make effort to conform the EDN received to EDN Spec. The lib that generated this EDN should be responsible for this. For more information on Edn Spec please visit: https://github.com/edn-format/edn.
* Current example usage in crate transistor
Cargo.toml
toml
[dependencies]
edn-rs = "0.10.5"
Parse an EDN token into a Edn
with edn!
macro:
```rust
use edn_rs::{
edn, Edn, List
};
fn main() { let edn = edn!((sym 1.2 3 false :f nil 3/4)); let expected = Edn::List( List::new( vec![ Edn::Symbol("sym".tostring()), Edn::Double(1.2.into()), Edn::Int(3), Edn::Bool(false), Edn::Key("f".tostring()), Edn::Nil, Edn::Rational("3/4".to_string()) ] ) );
println!("{:?}", edn);
assert_eq!(edn, expected);
} ```
Parse an EDN String with parse_edn
:
```rust
use ednrs::{
set, map,
Edn, Map, Vector, Set,
parseedn
};
use std::str::FromStr;
fn main() -> Result<(), String> { let ednstr = "{:a \"2\" :b [true false] :c #{:A {:a :b} nil}}"; let edn = Edn::fromstr(edn_str);
assert_eq!(
edn,
Ok(Edn::Map(Map::new(
map!{
":a".to_string() => Edn::Str("2".to_string()),
":b".to_string() => Edn::Vector(Vector::new(vec![Edn::Bool(true), Edn::Bool(false)])),
":c".to_string() => Edn::Set(Set::new(
set!{
Edn::Map(Map::new(map!{":a".to_string() => Edn::Key(":b".to_string())})),
Edn::Key(":A".to_string()),
Edn::Nil}))}
)))
);
// OR
let edn_resp = parse_edn(edn_str)?;
assert_eq!(edn_resp[":b"][0], Edn::Bool(true));
Ok(())
} ```
To navigate through Edn
data you can just use get
and get_mut
:
```rust use edn_rs::{ edn, Edn, List, Map };
fn main() { let edn = edn!((sym 1.2 3 {false :f nil 3/4}));
println!("{:?}", edn);
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()));
} ```
Serializes Rust Types into EDN ```rust use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use ednrs::{ Serialize, serstruct, map, set, hmap, hset };
fn main() {
serstruct!{
#[derive(Debug, Clone)]
struct Edn {
btreemap: BTreeMap
println!("{}",edn.serialize());
// { :btreemap {:this-is-a-key [\"with\", \"many\", \"keys\"]}, :btreeset #{3, 4, 5}, :hashmap {:this-is-a-key [\"with\", \"many\", \"keys\"]}, :hashset #{3}, :tuples (3, true, \\d), }
} ```
Emits EDN format from a Json file ```rust use ednrs::jsonto_edn;
fn main() { let json = String::from(r#"{"hello": "world"}"#); let edn = String::from(r#"{:hello "world"}"#);
println!("{:?}", json_to_edn(json.clone()));
assert_eq!(edn, json_to_edn(json));
let complex_json = String::from(r#"{
"people":
[
{
"name": "otavio",
"age": 22
},
{
"name": "Julia",
"age": 32.0
}
],
"country or origin": "Brazil",
"queerentener": true,
"brain": null
}"#);
println!("{:?}", json_to_edn(complex_json.clone()).replace(" ", "").replace("\n", " "));
// "{ :people [ { :name \"otavio\", :age 22 }, { :name \"Julia\", :age 32.0 } ], :country-or-origin \"Brazil\", :queerentener true, :brain nil }"
} ```
struct
to map EDN info EdnNode
EdnType
Edn::Bool(true).into() -> true
. This was done by to_float
, to_bool
, to_int
, to_vec
.parse_edn
:
""
"\"string\""
"324352"
, "3442.234"
, "3/4"
:a
sym-bol-s
"[1 :2 \"d\"]"
"(1 :2 \"d\")"
"#{1 2 3}"
"{:a 1 :b 2 }"
"{:a \"2\" :b [true false] :c #{:A {:a :b} nil}}"
edn!
:
"[1 2 [:3 \"4\"]]"
"[1 2 #{:3 \"4\"}]"
"(1 2 (:3 \"4\"))"
"'#{1 2 (:3 \"4\")}"
"{:a 2 :b {:3 \"4\"}}"
, "{:a 2 :b [:3 \"4\"]}"
set_iter
edn-derive
derive Serialize
derive Deserialize