#s-expr #serialization #serde #derive-deserialize #kicad

serde_kicad_sexpr

KiCAD v6 S-表达式格式

1个不稳定版本

0.1.0 2022年1月15日

#1427 in 编码

Apache-2.0 OR LGPL-3.0

59KB
2K SLoC

serde_kicad_sexpr 许可证 Apache-2.0 许可证 LGPL-3.0 GitHub

此crate提供了用于KiCAD使用的S-表达式数据格式的serde SerializerDeserializer实现。由于此格式在某些核心方面与其他格式(如JSON)不同,因此存在一些限制和特殊案例,您应该注意

  • 您的结构体名称很重要。对于一个简单的结构体,例如

    #[derive(Deserialize, Serialize)]
    struct Point(i32, i32);
    

    和示例值Point(1, 2),您将得到一个JSON表示形式为[1, 2]的JSON表示,而此crate将输出(Point 1 2)

  • 如果字段的类型是布尔值、元组或序列,则字段名称也很重要。这些字段不能出现在无名称的容器中(即元组结构体)。

  • 不支持反序列化Option,因为我们需要知道选项内部的数据类型以确定它是否存在或不存在。要反序列化可选值,请使用此crate提供的自定义反序列化逻辑

    #[derive(Deserialize, Serialize)]
    struct Position {
        x: i32,
        y: i32,
        #[serde(with = "serde_kicad_sexpr::Option")]
        rotation: Option<i32>
    }
    
  • 如果您需要反序列化某种具有未知子项数量的容器,请使用具有空名称的特殊字段,如下所示

    #[derive(Deserialize, Serialize)]
    struct Point(i32, i32);
    
    #[derive(Deserialize, Serialize)]
    struct Polygon {
        #[serde(default, rename = "")]
        points: Vec<Point>
    }
    

    请注意,这必须是结构体的最后一个字段。在具有空名称的字段之后不得有任何字段,并且只能有一个具有空名称的字段。

  • 不支持未标记的枚举。如果您需要从多种类型中解析一个,请使用untagged!

    serde_kicad_sexpr::untagged! {
        enum TextOrNumber {
            Text(String),
            Int(i32),
            Float(f32)
        }
    }
    

许可证

根据您的选择,本软件许可协议适用于Apache许可证版本2.0GNU通用公共许可证版本3.0

除非您明确表示,否则您根据Apache-2.0许可证定义的贡献,有意提交给本软件包的,将按上述方式双重许可,无需附加条款或条件。

依赖项

~0.4–1.6MB
~35K SLoC