transporter/rust/
struct_.rs1use 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}