#s-expr #serde #serialization #character

serde_sexpr

Serde对S-表达式的支持

1 个不稳定版本

0.1.0 2019年5月16日

#35#s-expr

Download history 34/week @ 2024-03-14 60/week @ 2024-03-21 90/week @ 2024-03-28 55/week @ 2024-04-04 133/week @ 2024-04-11 194/week @ 2024-04-18 204/week @ 2024-04-25 253/week @ 2024-05-02 153/week @ 2024-05-09 176/week @ 2024-05-16 386/week @ 2024-05-23 489/week @ 2024-05-30 458/week @ 2024-06-06 334/week @ 2024-06-13 184/week @ 2024-06-20 98/week @ 2024-06-27

1,229 每月下载量
3 软件包中使用(2 个直接使用)

Apache-2.0/MIT

39KB
760 代码行

serde_sexpr

Build Status Dependency Status Documentation

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