1 个不稳定版本
0.1.0 | 2019年5月16日 |
---|
#35 在 #s-expr
1,229 每月下载量
在 3 个 软件包中使用(2 个直接使用)
39KB
760 代码行
serde_sexpr
Serde对S-表达式的支持。
有关更多信息,请参阅文档。
许可
许可协议如下
- Apache License, Version 2.0,在LICENSE-APACHE文件中
- MIT License,在LICENSE-MIT文件中
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的您提交的任何旨在包含在作品中的贡献,都将如上所述双许可,不附加任何额外条款或条件。
lib.rs
:
Serde对S-表达式的支持。
示例
可以使用除(
、)
、|
、\
和空白字符之外的任何字符作为符号。如果您想使用这些字符之一,可以使用一个转义符号,它被|
字符包围。在转义符号内部,可以使用这些字符,并用反斜杠转义。
// Serialize!
let value = vec!["Hello!".to_string(), "Goodbye, world!".to_string(), ")|(".to_string()];
let sexpr = serde_sexpr::to_string(&value).unwrap();
assert_eq!(sexpr, "(Hello! |Goodbye,\\ world!| |\\)\\|\\(|)");
// Deserialize!
let value2: Vec<String> = serde_sexpr::from_str(&sexpr).unwrap();
assert_eq!(value, value2);
类型如下进行序列化
assert_eq!(serde_sexpr::to_string(&true).unwrap(), "true");
assert_eq!(serde_sexpr::to_string(&42i8).unwrap(), "42");
assert_eq!(serde_sexpr::to_string(&42i16).unwrap(), "42");
assert_eq!(serde_sexpr::to_string(&42i32).unwrap(), "42");
assert_eq!(serde_sexpr::to_string(&42i64).unwrap(), "42");
assert_eq!(serde_sexpr::to_string(&42u8).unwrap(), "42");
assert_eq!(serde_sexpr::to_string(&42u16).unwrap(), "42");
assert_eq!(serde_sexpr::to_string(&42u32).unwrap(), "42");
assert_eq!(serde_sexpr::to_string(&42u64).unwrap(), "42");
assert_eq!(serde_sexpr::to_string(&123.45f32).unwrap(), "123.45");
assert_eq!(serde_sexpr::to_string(&123.45f64).unwrap(), "123.45");
assert_eq!(serde_sexpr::to_string(&'%').unwrap(), "%");
let s1: String = "s1".to_string();
let s2: &str = "s2";
assert_eq!(serde_sexpr::to_string(&s1).unwrap(), "s1");
assert_eq!(serde_sexpr::to_string(&s2).unwrap(), "s2");
let b1: Vec<u8> = b"s1".to_vec();
let b2: &[u8] = b"s2";
assert_eq!(serde_sexpr::to_string(&b1).unwrap(), "(115 49)");
assert_eq!(serde_sexpr::to_string(&b2).unwrap(), "(115 50)");
let o1: Option<&str> = Some("foo");
let o2: Option<&str> = None;
assert_eq!(serde_sexpr::to_string(&o1).unwrap(), "foo");
assert_eq!(serde_sexpr::to_string(&o2).unwrap(), "()");
let mut map = BTreeMap::new();
map.insert(1, "yi");
map.insert(2, "er");
map.insert(3, "san");
let t = (4, "five", b"SIX");
let v = vec!["uno", "dos", "tres"];
assert_eq!(serde_sexpr::to_string(&()).unwrap(), "()");
assert_eq!(serde_sexpr::to_string(&map).unwrap(), "((1 yi) (2 er) (3 san))");
assert_eq!(serde_sexpr::to_string(&t).unwrap(), "(4 five (83 73 88))");
assert_eq!(serde_sexpr::to_string(&v).unwrap(), "(uno dos tres)");
#[derive(Serialize)]
struct UnitStruct;
#[derive(Serialize)]
struct NewtypeStruct(i32);
#[derive(Serialize)]
struct TupleStruct(i32, bool);
#[derive(Serialize)]
struct Struct {
foo: i32,
bar: bool,
}
#[derive(Serialize)]
enum Foo {
UnitVariant,
NewtypeVariant(i32),
TupleVariant(i32, bool),
StructVariant {
foo: i32,
bar: bool,
}
}
assert_eq!(serde_sexpr::to_string(&UnitStruct).unwrap(), "()");
assert_eq!(serde_sexpr::to_string(&NewtypeStruct(42)).unwrap(), "42");
assert_eq!(serde_sexpr::to_string(&TupleStruct(42, true)).unwrap(), "(42 true)");
assert_eq!(
serde_sexpr::to_string(&Struct { foo: 42, bar: true }).unwrap(),
"((foo 42) (bar true))"
);
assert_eq!(serde_sexpr::to_string(&Foo::UnitVariant).unwrap(), "UnitVariant");
assert_eq!(serde_sexpr::to_string(&Foo::NewtypeVariant(42)).unwrap(), "(NewtypeVariant 42)");
assert_eq!(
serde_sexpr::to_string(&Foo::TupleVariant(42, true)).unwrap(),
"(TupleVariant 42 true)"
);
assert_eq!(
serde_sexpr::to_string(&Foo::StructVariant { foo: 42, bar: true }).unwrap(),
"(StructVariant (foo 42) (bar true))"
);
相应地反序列化
assert_eq!(serde_sexpr::from_str::<bool>("true").unwrap(), true);
assert_eq!(serde_sexpr::from_str::<i8>("42").unwrap(), 42);
assert_eq!(serde_sexpr::from_str::<i16>("42").unwrap(), 42);
assert_eq!(serde_sexpr::from_str::<i32>("42").unwrap(), 42);
assert_eq!(serde_sexpr::from_str::<i64>("42").unwrap(), 42);
assert_eq!(serde_sexpr::from_str::<u8>("42").unwrap(), 42);
assert_eq!(serde_sexpr::from_str::<u16>("42").unwrap(), 42);
assert_eq!(serde_sexpr::from_str::<u32>("42").unwrap(), 42);
assert_eq!(serde_sexpr::from_str::<u64>("42").unwrap(), 42);
assert_eq!(serde_sexpr::from_str::<f32>("123.45").unwrap(), 123.45);
assert_eq!(serde_sexpr::from_str::<f64>("123.45").unwrap(), 123.45);
assert_eq!(serde_sexpr::from_str::<char>("%").unwrap(), '%');
assert_eq!(serde_sexpr::from_str::<String>("s1").unwrap(), "s1");
assert_eq!(serde_sexpr::from_str::<Vec<u8>>("(115 49)").unwrap(), b"s1");
assert_eq!(serde_sexpr::from_str::<Option<String>>("foo").unwrap(), Some("foo".to_string()));
assert_eq!(serde_sexpr::from_str::<Option<String>>("()").unwrap(), None);
let mut map = BTreeMap::new();
map.insert(1, "yi".to_string());
map.insert(2, "er".to_string());
map.insert(3, "san".to_string());
assert_eq!(serde_sexpr::from_str::<()>("()").unwrap(), ());
assert_eq!(
serde_sexpr::from_str::<BTreeMap<i32, String>>("((1 yi) (2 er) (3 san))").unwrap(),
map
);
assert_eq!(
serde_sexpr::from_str::<(i32, String, Vec<u8>)>("(4 five (83 73 88))").unwrap(),
(4, "five".to_string(), b"SIX".to_vec())
);
assert_eq!(
serde_sexpr::from_str::<Vec<String>>("(uno dos tres)").unwrap(),
vec!["uno", "dos", "tres"]
);
#[derive(Debug, Deserialize, PartialEq)]
struct UnitStruct;
#[derive(Debug, Deserialize, PartialEq)]
struct NewtypeStruct(i32);
#[derive(Debug, Deserialize, PartialEq)]
struct TupleStruct(i32, bool);
#[derive(Debug, Deserialize, PartialEq)]
struct Struct {
foo: i32,
bar: bool,
}
#[derive(Debug, Deserialize, PartialEq)]
enum Foo {
UnitVariant,
NewtypeVariant(i32),
TupleVariant(i32, bool),
StructVariant {
foo: i32,
bar: bool,
}
}
assert_eq!(serde_sexpr::from_str::<UnitStruct>("()").unwrap(), UnitStruct);
assert_eq!(serde_sexpr::from_str::<NewtypeStruct>("42").unwrap(), NewtypeStruct(42));
assert_eq!(serde_sexpr::from_str::<TupleStruct>("(42 true)").unwrap(), TupleStruct(42, true));
assert_eq!(
serde_sexpr::from_str::<Struct>("((foo 42) (bar true))").unwrap(),
Struct { foo: 42, bar: true }
);
assert_eq!(serde_sexpr::from_str::<Foo>("UnitVariant").unwrap(), Foo::UnitVariant);
assert_eq!(serde_sexpr::from_str::<Foo>("(NewtypeVariant 42)").unwrap(), Foo::NewtypeVariant(42));
eprintln!("x");
assert_eq!(
serde_sexpr::from_str::<Foo>("(TupleVariant 42 true)").unwrap(),
Foo::TupleVariant(42, true)
);
eprintln!("x");
assert_eq!(
serde_sexpr::from_str::<Foo>("(StructVariant (foo 42) (bar true))").unwrap(),
Foo::StructVariant { foo: 42, bar: true }
);
依赖项
~1–1.3MB
~25K SLoC