#nested #struct #proc-macro

structstruck

嵌套结构体和枚举定义

8个不稳定版本 (3个破坏性版本)

0.4.1 2023年4月20日
0.4.0 2023年2月22日
0.3.0 2022年11月19日
0.2.2 2022年10月14日
0.1.0 2022年4月11日

#199过程宏

Download history 1026/week @ 2024-04-23 948/week @ 2024-04-30 950/week @ 2024-05-07 1311/week @ 2024-05-14 1456/week @ 2024-05-21 1740/week @ 2024-05-28 1132/week @ 2024-06-04 840/week @ 2024-06-11 1034/week @ 2024-06-18 1101/week @ 2024-06-25 1153/week @ 2024-07-02 1068/week @ 2024-07-09 1040/week @ 2024-07-16 1139/week @ 2024-07-23 1321/week @ 2024-07-30 1326/week @ 2024-08-06

5,053 每月下载量
用于 9 个crate(6个直接使用)

MIT 许可

45KB
1K SLoC

StructStruck

是否曾有过深度嵌套的JSON结构体

{
    "outer": {
        "middle": {
            "inner": {
                "foo": "bar"
            }
        }
    }
}

并且想要用相同的方式编写Rust结构体来处理数据?

struct Parent {
    outer: struct {
        middle: struct {
            inner: struct {
                foo: String,
            }
        }
    }
}

这个过程宏crate正好可以实现这一点。请查看文档以了解具体方法。

为了说明,一些更多用例

  • 一个枚举,其中每个变体都有自己的结构体,名称与变体完全相同。
structstruck::strike! {
    enum Token {
        Identifier(struct {
            name: String,
        }),
        Punctuation(struct {
            character: char,
        }),
    }
}
  • 我的原始用例:使用kube方便地编写Kubernetes自定义资源。
structstruck::strike! {
    #[strikethrough[derive(Deserialize, Serialize, Clone, Debug, Validate, JsonSchema)]]
    #[strikethrough[serde(rename_all = "camelCase")]]
    #[derive(CustomResource)]
    #[kube(
        group = "kafka.strimzi.io",
        version = "v1beta2",
        kind = "Kafka",
        namespaced
    )]
    struct KafkaSpec {
        kafka: struct KafkaCluster {
            #[validate(length(min = 1))]
            version: String,
            #[validate(range(min = 1))]
            replicas: u32,
            listeners: Vec<struct KafkaListener {
                name: String,
                port: u16,
                r#type: String,
                tls: bool,
            }>,
            config: HashMap<String, JsonValue>,
            storage: struct {
                r#type: String,
                volumes: Vec<struct Volume {
                    id: Option<u64>,
                    r#type: String,
                    size: String,
                    delete_claim: bool,
                }>,
            },
        },
        zookeeper: struct {
            #[validate(range(min = 1))]
            replicas: u32,
            storage: Volume,
        },
        entity_operator: struct {
            topic_operator: Option<HashMap<String, JsonValue>>,
            user_operator: Option<HashMap<String, JsonValue>>,
        },
    }
}

依赖关系

~305KB