/
models.mustache
178 lines (161 loc) · 8.64 KB
/
models.mustache
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#![allow(unused_imports, unused_qualifications, unused_extern_crates)]
use serde::{Deserialize, Serialize};
use serde::ser::Serializer;
use serde::de::{DeserializeOwned, Deserializer};
use std::cmp::Eq;
use std::collections::HashMap;
use std::default::Default;
use std::hash::Hash;
fn deserialize_nonoptional_vec<'de, D: Deserializer<'de>, T: DeserializeOwned>(
d: D,
) -> Result<Vec<T>, D::Error> {
serde::Deserialize::deserialize(d).map(|x: Option<_>| x.unwrap_or(Vec::new()))
}
fn deserialize_nonoptional_map<'de, D: Deserializer<'de>, T: DeserializeOwned>(
d: D,
) -> Result<HashMap<String, T>, D::Error> {
serde::Deserialize::deserialize(d).map(|x: Option<_>| x.unwrap_or(HashMap::new()))
}
#[cfg(feature = "time")]
pub type BollardDate = time::OffsetDateTime;
#[cfg(feature = "chrono")]
pub type BollardDate = chrono::DateTime<chrono::Utc>;
#[cfg(not(any(feature = "chrono", feature = "time")))]
pub type BollardDate = String;
#[cfg(feature = "time")]
fn deserialize_timestamp<'de, D: Deserializer<'de>>(
d: D
) -> Result<Option<BollardDate>, D::Error> {
let opt: Option<String> = serde::Deserialize::deserialize(d)?;
if let Some(s) = opt {
Ok(Some(
time::OffsetDateTime::parse(&s, &time::format_description::well_known::Rfc3339)
.map_err(|e| serde::de::Error::custom(format!("{:?}", e)))?,
))
} else {
Ok(None)
}
}
#[cfg(not(feature = "time"))]
fn deserialize_timestamp<'de, D: Deserializer<'de>>(
d: D
) -> Result<Option<BollardDate>, D::Error> {
serde::Deserialize::deserialize(d)
}
#[cfg(feature = "time")]
fn serialize_timestamp<S: Serializer>(date: &Option<BollardDate>, s: S) -> Result<S::Ok, S::Error> {
match date {
Some(inner) => Ok(s.serialize_str(&inner.format(&time::format_description::well_known::Rfc3339)
.map_err(|e| serde::ser::Error::custom(format!("{:?}", e)))?)?),
None => Ok(s.serialize_str("")?)
}
}
#[cfg(not(feature = "time"))]
fn serialize_timestamp<S: Serializer>(date: &Option<BollardDate>, s: S) -> Result<S::Ok, S::Error> {
match date {
Some(inner) => s.serialize_some(inner),
None => s.serialize_none()
}
}
{{#models}}{{#model}}
{{#description}}/// {{{description}}}
{{/description}}{{#isEnum}}/// Enumeration of values.
/// Since this enum's variants do not hold data, we can easily define them them as `#[repr(C)]`
/// which helps with FFI.
#[allow(non_camel_case_types)]
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Serialize, Deserialize, Eq, Ord)]{{#xmlName}}
#[serde(rename = "{{xmlName}}")]{{/xmlName}}
pub enum {{classname}} { {{#allowableValues}}{{#enumVars}}
#[serde(rename = {{{value}}})]
{{name}},{{/enumVars}}{{/allowableValues}}
}
impl ::std::fmt::Display for {{classname}} {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
match *self { {{#allowableValues}}{{#enumVars}}
{{classname}}::{{name}} => write!(f, "{}", {{{value}}}),{{/enumVars}}{{/allowableValues}}
}
}
}
impl ::std::str::FromStr for {{classname}} {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
{{#allowableValues}}{{#enumVars}} {{{value}}} => Ok({{classname}}::{{name}}),
{{/enumVars}}{{/allowableValues}} _ => Err(()),
}
}
}
{{/isEnum}}{{^isEnum}}{{^dataType}}{{#arrayModelType}}{{! vec}}
pub type {{classname}} = {{{arrayModelType}}};
{{/arrayModelType}}{{^arrayModelType}}{{#emptyVars}}// special-casing PortMap, cos swagger-codegen doesn't figure out this type
pub type {{classname}} = HashMap<String, Option<Vec<PortBinding>>>;
{{/emptyVars}}{{^emptyVars}}{{! general struct}}#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]{{#xmlName}}
#[serde(rename = "{{xmlName}}")]{{/xmlName}}
pub struct {{classname}} {
{{#vars}}{{#description}} /// {{{description}}}
{{/description}} #[serde(rename = "{{baseName}}")]{{#vendorExtensions}}{{#itemXmlName}}
#[serde(serialize_with = "wrap_in_{{itemXmlName}}")]{{/itemXmlName}}{{/vendorExtensions}}{{#required}}{{#isContainer}}{{^isListContainer}}
#[serde(deserialize_with = "deserialize_nonoptional_map")]{{/isListContainer}}{{#isListContainer}}
#[serde(deserialize_with = "deserialize_nonoptional_vec")]{{/isListContainer}}{{/isContainer}}{{#isEnum}}
#[serde(skip_serializing_if="Option::is_none")]
#[serde(with = "serde_with::rust::string_empty_as_none")]{{/isEnum}}{{#vendorExtensions.x-rustgen-is-datetime}}
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]{{/vendorExtensions.x-rustgen-is-datetime}}
pub {{name}}: {{#isEnum}}Option<{{classname}}{{enumName}}>{{/isEnum}}{{^isEnum}}{{#isListContainer}}Vec<{{#items}}{{{datatype}}}{{/items}}>{{/isListContainer}}{{^isListContainer}}{{#isContainer}}HashMap<String, {{#items}}{{{datatype}}}{{/items}}>{{/isContainer}}{{^isContainer}}{{{datatype}}}{{/isContainer}}{{/isListContainer}}{{/isEnum}}{{#vendorExtensions}}{{/vendorExtensions}},
{{/required}}{{^required}}
#[serde(skip_serializing_if="Option::is_none")]{{#vendorExtensions.x-rustgen-is-datetime}}
#[serde(default, deserialize_with = "deserialize_timestamp", serialize_with = "serialize_timestamp")]{{/vendorExtensions.x-rustgen-is-datetime}}
pub {{name}}: Option<{{#isEnum}}{{classname}}{{enumName}}{{/isEnum}}{{^isEnum}}{{#isListContainer}}Vec<{{#items}}{{{datatype}}}{{/items}}>{{/isListContainer}}{{^isListContainer}}{{#isContainer}}HashMap<String, {{#items}}{{{datatype}}}{{/items}}>{{/isContainer}}{{^isContainer}}{{{datatype}}}{{/isContainer}}{{/isListContainer}}{{/isEnum}}{{#vendorExtensions}}{{/vendorExtensions}}>,
{{/required}}
{{/vars}}
}
{{#vars}}{{#isEnum}}
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Serialize, Deserialize, Eq, Ord)]{{#xmlName}}
#[serde(rename = "{{xmlName}}")]{{/xmlName}}
pub enum {{classname}}{{enumName}} { {{#vendorExtensions}}{{^x-rustgen-has-empty-enum}}
#[serde(rename = "")]
EMPTY,{{/x-rustgen-has-empty-enum}}{{/vendorExtensions}}{{#allowableValues}}{{#enumVars}}
#[serde(rename = {{{value}}})]
{{name}},{{/enumVars}}{{/allowableValues}}{{#vendorExtensions}}{{#x-rustgen-additional-enum-values}}
#[serde(rename = {{{value}}})]
{{name}},{{/x-rustgen-additional-enum-values}}{{/vendorExtensions}}
}
impl ::std::fmt::Display for {{classname}}{{enumName}} {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
match *self { {{#vendorExtensions}}{{^x-rustgen-has-empty-enum}}
{{classname}}{{enumName}}::EMPTY => write!(f, ""),{{/x-rustgen-has-empty-enum}}{{/vendorExtensions}}{{#allowableValues}}{{#enumVars}}
{{classname}}{{enumName}}::{{name}} => write!(f, "{}", {{{value}}}),{{/enumVars}}{{/allowableValues}}{{#vendorExtensions}}{{#x-rustgen-additional-enum-values}}
{{classname}}{{enumName}}::{{name}} => write!(f, "{}", {{{value}}}),{{/x-rustgen-additional-enum-values}}{{/vendorExtensions}}
}
}
}
impl ::std::str::FromStr for {{classname}}{{enumName}} {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s { {{#vendorExtensions}}{{^x-rustgen-has-empty-enum}}
"" => Ok({{classname}}{{enumName}}::EMPTY),{{/x-rustgen-has-empty-enum}}{{/vendorExtensions}}
{{#allowableValues}}{{#enumVars}} {{{value}}} => Ok({{classname}}{{enumName}}::{{name}}),
{{/enumVars}}{{/allowableValues}}{{#vendorExtensions}}{{#x-rustgen-additional-enum-values}} {{{value}}} => Ok({{classname}}{{enumName}}::{{name}}),
{{/x-rustgen-additional-enum-values}}{{/vendorExtensions}} x => Err(format!("Invalid enum type: {}", x)),
}
}
}
impl ::std::convert::AsRef<str> for {{classname}}{{enumName}} {
fn as_ref(&self) -> &str {
match self { {{#vendorExtensions}}{{^x-rustgen-has-empty-enum}}
{{classname}}{{enumName}}::EMPTY => "",{{/x-rustgen-has-empty-enum}}{{/vendorExtensions}}{{#allowableValues}}{{#enumVars}}
{{classname}}{{enumName}}::{{name}} => {{{value}}},{{/enumVars}}{{/allowableValues}}{{#vendorExtensions}}{{#x-rustgen-additional-enum-values}}
{{classname}}{{enumName}}::{{name}} => {{{value}}},{{/x-rustgen-additional-enum-values}}{{/vendorExtensions}}
}
}
}
{{/isEnum}}{{/vars}}{{/emptyVars}}{{/arrayModelType}}{{/dataType}}{{/isEnum}}{{/model}}{{/models}}{{#usesXmlNamespaces}}
//XML namespaces
pub mod namespaces {
lazy_static!{
{{#models}}{{#model}}{{#xmlNamespace}}pub static ref {{#vendorExtensions}}{{upperCaseName}}{{/vendorExtensions}}: String = "{{xmlNamespace}}".to_string();
{{/xmlNamespace}}{{/model}}{{/models}}
}
}
{{/usesXmlNamespaces}}