{{>partial_header}}
{{!--
algonaut customization of the stock openapi-generator rust `model.mustache`.
openapi/preprocess.py injects the vendor extensions consumed here:
- x-rust-imports (schema) -> the `use` lines the model file needs;
- x-rust-type (property) -> an exact Rust type override, for domain types
the spec cannot express; takes precedence over the rules below;
- x-rust-serde (property) -> extra `#[serde(..)]` attributes.
Absent an override, every integer/long leaf (scalar or Vec element) is
forced to `u64`, and `format: byte` fields emit `algonaut_encoding::Bytes`.
See docs/adr/openapi-client-regeneration.md.
--}}
{{#models}}
{{#model}}
{{#vendorExtensions.x-rust-imports}}
{{{.}}}
{{/vendorExtensions.x-rust-imports}}
{{#vendorExtensions.x-rust-imports.0}}
{{/vendorExtensions.x-rust-imports.0}}
{{#description}}
/// {{{classname}}} : {{{description}}}
{{/description}}
{{!-- for enum schemas --}}
{{#isEnum}}
/// {{{description}}}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum {{{classname}}} {
{{#allowableValues}}
{{#enumVars}}
#[serde(rename = "{{{value}}}")]
{{{name}}},
{{/enumVars}}{{/allowableValues}}
}
impl ToString for {{{classname}}} {
fn to_string(&self) -> String {
match self {
{{#allowableValues}}
{{#enumVars}}
Self::{{{name}}} => String::from("{{{value}}}"),
{{/enumVars}}
{{/allowableValues}}
}
}
}
impl Default for {{{classname}}} {
fn default() -> {{{classname}}} {
{{#allowableValues}}
Self::{{ enumVars.0.name }}
{{/allowableValues}}
}
}
{{/isEnum}}
{{!-- for schemas that have a discriminator --}}
{{#discriminator}}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(tag = "{{{vendorExtensions.x-tag-name}}}")]
pub enum {{{classname}}} {
{{#vendorExtensions}}
{{#x-mapped-models}}
#[serde(rename="{{mappingName}}")]
{{{modelName}}} {
{{#vars}}
{{#description}}
/// {{{.}}}
{{/description}}
#[serde(rename = "{{{baseName}}}"{{^required}}, skip_serializing_if = "Option::is_none"{{/required}})]
{{{name}}}: {{#required}}{{#isNullable}}Option<{{/isNullable}}{{/required}}{{^required}}Option<{{/required}}{{#isEnum}}{{{enumName}}}{{/isEnum}}{{^isEnum}}{{#isModel}}Box<{{{dataType}}}>{{/isModel}}{{^isModel}}{{#isArray}}Vec<{{#items}}{{#isInteger}}u64{{/isInteger}}{{#isLong}}u64{{/isLong}}{{#isByteArray}}Bytes{{/isByteArray}}{{^isInteger}}{{^isLong}}{{^isByteArray}}{{{dataType}}}{{/isByteArray}}{{/isLong}}{{/isInteger}}{{/items}}>{{/isArray}}{{^isArray}}{{#isInteger}}u64{{/isInteger}}{{#isLong}}u64{{/isLong}}{{#isByteArray}}Bytes{{/isByteArray}}{{^isInteger}}{{^isLong}}{{^isByteArray}}{{{dataType}}}{{/isByteArray}}{{/isLong}}{{/isInteger}}{{/isArray}}{{/isModel}}{{/isEnum}}{{#required}}{{#isNullable}}>{{/isNullable}}{{/required}}{{^required}}>{{/required}},
{{/vars}}
},
{{/x-mapped-models}}
{{/vendorExtensions}}
}
{{/discriminator}}
{{!-- for non-enum schemas --}}
{{^isEnum}}
{{^discriminator}}
#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)]
pub struct {{{classname}}} {
{{#vars}}
{{#description}}
/// {{{.}}}
{{/description}}
#[serde(rename = "{{{baseName}}}"{{^required}}{{#isNullable}}, default, with = "::serde_with::rust::double_option"{{/isNullable}}{{/required}}{{^required}}, skip_serializing_if = "Option::is_none"{{/required}}{{#required}}{{#isNullable}}, deserialize_with = "Option::deserialize"{{/isNullable}}{{/required}}{{#vendorExtensions.x-rust-serde}}, {{{vendorExtensions.x-rust-serde}}}{{/vendorExtensions.x-rust-serde}})]
pub {{{name}}}: {{#isNullable}}Option<{{/isNullable}}{{^required}}Option<{{/required}}{{#vendorExtensions.x-rust-type}}{{{vendorExtensions.x-rust-type}}}{{/vendorExtensions.x-rust-type}}{{^vendorExtensions.x-rust-type}}{{#isEnum}}{{#isArray}}{{#uniqueItems}}std::collections::HashSet<{{/uniqueItems}}{{^uniqueItems}}Vec<{{/uniqueItems}}{{/isArray}}{{{enumName}}}{{#isArray}}>{{/isArray}}{{/isEnum}}{{^isEnum}}{{#isModel}}Box<{{{dataType}}}>{{/isModel}}{{^isModel}}{{#isArray}}Vec<{{#items}}{{#isInteger}}u64{{/isInteger}}{{#isLong}}u64{{/isLong}}{{#isByteArray}}Bytes{{/isByteArray}}{{^isInteger}}{{^isLong}}{{^isByteArray}}{{{dataType}}}{{/isByteArray}}{{/isLong}}{{/isInteger}}{{/items}}>{{/isArray}}{{^isArray}}{{#isInteger}}u64{{/isInteger}}{{#isLong}}u64{{/isLong}}{{#isByteArray}}Bytes{{/isByteArray}}{{^isInteger}}{{^isLong}}{{^isByteArray}}{{{dataType}}}{{/isByteArray}}{{/isLong}}{{/isInteger}}{{/isArray}}{{/isModel}}{{/isEnum}}{{/vendorExtensions.x-rust-type}}{{#isNullable}}>{{/isNullable}}{{^required}}>{{/required}},
{{/vars}}
}
impl {{{classname}}} {
{{#description}}
/// {{{.}}}
{{/description}}
pub fn new({{#requiredVars}}{{{name}}}: {{#isNullable}}Option<{{/isNullable}}{{#vendorExtensions.x-rust-type}}{{{vendorExtensions.x-rust-type}}}{{/vendorExtensions.x-rust-type}}{{^vendorExtensions.x-rust-type}}{{#isEnum}}{{#isArray}}Vec<{{/isArray}}{{{enumName}}}{{#isArray}}>{{/isArray}}{{/isEnum}}{{^isEnum}}{{#isModel}}{{{dataType}}}{{/isModel}}{{^isModel}}{{#isArray}}Vec<{{#items}}{{#isInteger}}u64{{/isInteger}}{{#isLong}}u64{{/isLong}}{{#isByteArray}}Bytes{{/isByteArray}}{{^isInteger}}{{^isLong}}{{^isByteArray}}{{{dataType}}}{{/isByteArray}}{{/isLong}}{{/isInteger}}{{/items}}>{{/isArray}}{{^isArray}}{{#isInteger}}u64{{/isInteger}}{{#isLong}}u64{{/isLong}}{{#isByteArray}}Bytes{{/isByteArray}}{{^isInteger}}{{^isLong}}{{^isByteArray}}{{{dataType}}}{{/isByteArray}}{{/isLong}}{{/isInteger}}{{/isArray}}{{/isModel}}{{/isEnum}}{{/vendorExtensions.x-rust-type}}{{#isNullable}}>{{/isNullable}}{{^-last}}, {{/-last}}{{/requiredVars}}) -> {{{classname}}} {
{{{classname}}} {
{{#vars}}
{{{name}}}{{^required}}{{#isArray}}: None{{/isArray}}{{#isMap}}: None{{/isMap}}{{^isContainer}}: None{{/isContainer}}{{/required}}{{#required}}{{#isModel}}: {{^isNullable}}Box::new({{{name}}}){{/isNullable}}{{#isNullable}}if let Some(x) = {{{name}}} {Some(Box::new(x))} else {None}{{/isNullable}}{{/isModel}}{{/required}},
{{/vars}}
}
}
}
{{/discriminator}}
{{/isEnum}}
{{!-- for properties that are of enum type --}}
{{#vars}}
{{#isEnum}}
/// {{{description}}}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum {{{enumName}}} {
{{#allowableValues}}
{{#enumVars}}
#[serde(rename = "{{{value}}}")]
{{{name}}},
{{/enumVars}}
{{/allowableValues}}
}
impl Default for {{{enumName}}} {
fn default() -> {{{enumName}}} {
{{#allowableValues}}
Self::{{ enumVars.0.name }}
{{/allowableValues}}
}
}
{{/isEnum}}
{{/vars}}
{{/model}}
{{/models}}