transporter/rust/
struct_.rs

1use std::collections::HashMap;
2use crate::{
3    schema::Field,
4    rust::{
5        type_,
6        keywords::MaybeKeyword,
7    },
8};
9use inflector::Inflector;
10
11pub(crate) fn build(
12    version: &str,
13    visibility: &str,
14    name: &str,
15    fields: &HashMap<String, Field>
16) -> String {
17    let upper: String = name.to_screaming_snake_case();
18
19    let fields: Vec<String> = fields.iter().map(|(name, type_)| {
20        if name.is_keyword() {
21            format!("
22    #[serde(rename = \"{name}\")]
23    {vis} {name}_: {type_},",
24                name = name,
25                type_ = type_::to_rust(type_),
26                vis = visibility,
27            )
28        } else {
29
30            format!("
31    {vis} {name}: {type_},",
32                name = name,
33                type_ = type_::to_rust(type_),
34                vis = visibility,
35            )
36        }
37    }).collect();
38
39    format!("
40#[derive(serde::Serialize, serde::Deserialize)]
41#[allow(dead_code)]
42{vis} struct {name} {{{fields}
43}}
44
45#[allow(dead_code)]
46const {upper}_VERSION: &str = \"{name}@{version}\";
47#[allow(dead_code)]
48const {upper}_CONTENT_TYPE: &str = \"application/json; ttype={name}@{version}\";
49",
50        name = name,
51        fields = fields.join(""),
52        vis = visibility,
53        upper = upper,
54        version = version,
55    )
56}