18 releases
0.7.0 | Jun 15, 2024 |
---|---|
0.5.0 | Sep 30, 2020 |
0.4.3 | Sep 19, 2020 |
0.3.7 | Sep 13, 2020 |
0.1.2 | Aug 16, 2020 |
#1307 in Procedural macros
53 downloads per month
Used in 3 crates
17KB
326 lines
DEPRECATION NOTICE
This crate and its main crate, edn-rs, will not have any further work done.
edn-derive
Edn derive procedural macros for (De)Serialization.
This library still is beta
but very close to stable.
Usage
[dependencies]
edn-derive = "0.7.0"
Example
Serialization
use edn_derive::Serialize;
#[derive(Serialize)]
enum Kind {
Cool,
Chill,
Pirate,
}
#[derive(Serialize)]
pub struct Person {
name: String,
age: usize,
kind: Kind,
}
fn main() {
let person = Person {
name: "joana".to_string(),
age: 290000,
kind: Kind::Chill,
};
assert_eq!(
edn_rs::to_string(person),
"{ :name \"joana\", :age 290000, :kind :kind/chill, }"
);
}
Deserialization
use edn_derive::Deserialize;
use edn_rs::EdnError;
// The `Debug` and `PartialEq` are only necessary because of `assert_eq`, you don't need them
#[derive(Deserialize, Debug, PartialEq)]
enum Kind {
Cool,
Chill,
Pirate,
}
// The `Debug` and `PartialEq` are only necessary because of `assert_eq`, you don't need them
#[derive(Deserialize, Debug, PartialEq)]
pub struct Person {
name: String,
age: usize,
kind: Kind,
}
fn main() -> Result<(), EdnError> {
let edn_person = "{ :name \"joana\", :age 290000, :kind :kind/pirate, }";
let person: Person = edn_rs::from_str(edn_person)?;
assert_eq!(
person,
Person {
name: "joana".to_string(),
age: 290000,
kind: Kind::Pirate,
}
);
Ok(())
}
With more complexity using .
, -
and /
on EDN conversions:
use edn_derive::{Deserialize, Serialize};
use edn_rs::EdnError;
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
enum AccountType {
Basic,
Premium,
PremiumPlus,
}
#[allow(non_snake_case)]
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
struct Account {
crux__db___id: String,
account___amount: usize,
account_type: AccountType,
}
fn main() -> Result<(), EdnError> {
let account = Account {
crux__db___id: "123".to_string(),
account___amount: 42,
account_type: AccountType::PremiumPlus,
};
let account_edn_str =
"{ :crux.db/id \"123\", :account/amount 42, :account-type :account-type/premium-plus, }";
assert_eq!(edn_rs::to_string(account), account_edn_str);
let account: Account = edn_rs::from_str(account_edn_str)?;
assert_eq!(
account,
Account {
crux__db___id: "123".to_string(),
account___amount: 42,
account_type: AccountType::PremiumPlus,
}
);
Ok(())
}
Dependencies
~0.4–0.8MB
~19K SLoC