Ever had a deeply nested JSON struct
{
"outer": {
"middle": {
"inner": {
"foo": "bar"
}
}
}
}and wanted to write the Rust structs to handle that data just in the same nested way?
structParent{outer:struct{middle:struct{inner:struct{foo:String,}}}}This proc macro crate allows exactly that. Check the docs on how exaclty.
For illustration, some more usecases:
- an enum where every variant has its own struct, named exactly the same as the variant.
structstruck::strike! {enumToken{Identifier(struct{
name:String,}),Punctuation(struct{
character:char,}),}}- my original use case: conveniently write kubernetes custom resources with
kube.
structstruck::strike! {
#[structstruck::each[derive(Deserialize,Serialize,Clone,Debug,Validate,JsonSchema)]]
#[structstruck::each[serde(rename_all = "camelCase")]]
#[derive(CustomResource)]
#[kube(
group = "kafka.strimzi.io",
version = "v1beta2",
kind = "Kafka",
namespaced
)]structKafkaSpec{
kafka:structKafkaCluster{
#[validate(length(min = 1))]
version:String,
#[validate(range(min = 1))]
replicas:u32,
listeners:Vec<structKafkaListener{
name:String,
port:u16,
r#type:String,
tls:bool,}>,
config:HashMap<String,JsonValue>,
storage:struct{
r#type:String,
volumes:Vec<structVolume{
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>>,},}}