{{>partial_header}}
use crate::models;
use serde::{Deserialize, Serialize};
{{#models}}
{{#model}}
{{^isEnum}}{{#vendorExtensions.x-rust-has-byte-array}}
use serde_with::serde_as;
{{/vendorExtensions.x-rust-has-byte-array}}{{#vendorExtensions.x-rust-has-integer-property-enum}}
use serde_repr::{Serialize_repr,Deserialize_repr};
{{/vendorExtensions.x-rust-has-integer-property-enum}}{{/isEnum}}
{{#isEnum}}
{{#isInteger}}
use serde_repr::{Serialize_repr,Deserialize_repr};
{{/isInteger}}
{{/isEnum}}
{{#description}}
/// {{{description}}}
{{/description}}
{{!-- for repr(int) enum schemas --}}
{{#isEnum}}
{{#isInteger}}
#[repr(i64)]
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize_repr, Deserialize_repr)]
pub enum {{{classname}}} {
{{#allowableValues}}
{{#enumVars}}
{{{name}}} = {{{value}}},
{{/enumVars}}{{/allowableValues}}
}
impl std::fmt::Display for {{{classname}}} {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", match self {
{{#allowableValues}}
{{#enumVars}}
Self::{{{name}}} => "{{{value}}}",
{{/enumVars}}
{{/allowableValues}}
})
}
}
{{/isInteger}}
{{/isEnum}}
{{!-- for enum schemas --}}
{{#isEnum}}
{{^isInteger}}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
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}}
Self::{{{name}}} => write!(f, "{{{value}}}"),
{{/enumVars}}
{{/allowableValues}}
}
}
}
{{/isInteger}}
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 = "{{{propertyBaseName}}}")]
pub enum {{{classname}}} {
{{^oneOf}}
{{#mappedModels}}
#[serde(rename="{{mappingName}}")]
{{^vendorExtensions.x-rust-inline-variants}}
{{!-- newtype variant: the child's own fields survive; named by modelName (unique per mapping), wraps the real classname --}}
{{{modelName}}}({{^avoidBoxedModels}}Box<{{/avoidBoxedModels}}models::{{#model}}{{{classname}}}{{/model}}{{^model}}{{{modelName}}}{{/model}}{{^avoidBoxedModels}}>{{/avoidBoxedModels}}),
{{/vendorExtensions.x-rust-inline-variants}}
{{#vendorExtensions.x-rust-inline-variants}}
{{{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}}{{^avoidBoxedModels}}Box<{{/avoidBoxedModels}}{{{dataType}}}{{^avoidBoxedModels}}>{{/avoidBoxedModels}}{{/isModel}}{{^isModel}}{{{dataType}}}{{/isModel}}{{/isEnum}}{{#required}}{{#isNullable}}>{{/isNullable}}{{/required}}{{^required}}>{{/required}},
{{/vars}}
},
{{/vendorExtensions.x-rust-inline-variants}}
{{/mappedModels}}
{{/oneOf}}
{{^oneOf.isEmpty}}
{{#composedSchemas.oneOf}}
{{#description}}
/// {{{.}}}
{{/description}}
{{#-last}}
{{#discriminator.vendorExtensions.x-defaultMapping}}
#[serde(untagged)]
{{/discriminator.vendorExtensions.x-defaultMapping}}
{{^discriminator.vendorExtensions.x-defaultMapping}}
{{#baseName}}
#[serde(rename="{{{.}}}")]
{{/baseName}}
{{/discriminator.vendorExtensions.x-defaultMapping}}
{{/-last}}
{{^-last}}
{{#baseName}}
#[serde(rename="{{{.}}}")]
{{/baseName}}
{{/-last}}
{{{name}}}({{#isModel}}{{^avoidBoxedModels}}Box<{{/avoidBoxedModels}}{{/isModel}}{{{dataType}}}{{#isModel}}{{^avoidBoxedModels}}>{{/avoidBoxedModels}}{{/isModel}}),
{{/composedSchemas.oneOf}}
{{/oneOf.isEmpty}}
}
impl Default for {{classname}} {
fn default() -> Self {
{{^oneOf}}{{#mappedModels}}{{#-first}}{{^vendorExtensions.x-rust-inline-variants}}Self::{{modelName}}(Default::default()){{/vendorExtensions.x-rust-inline-variants}}{{#vendorExtensions.x-rust-inline-variants}}Self::{{modelName}} {
{{#vars}}
{{{name}}}: Default::default(),
{{/vars}}
}{{/vendorExtensions.x-rust-inline-variants}}{{/-first}}{{/mappedModels}}
{{/oneOf}}{{^oneOf.isEmpty}}{{#composedSchemas.oneOf}}{{#-first}}Self::{{{name}}}(Default::default()){{/-first}}{{/composedSchemas.oneOf}}{{/oneOf.isEmpty}}
}
}
{{/discriminator}}
{{!-- for non-enum schemas --}}
{{^isEnum}}
{{^discriminator}}
{{#oneOf.isEmpty}}{{^composedSchemas.anyOf}}#[serde_with::serde_as]
{{/composedSchemas.anyOf}}{{/oneOf.isEmpty}}{{!
}}{{#oneOf.isEmpty}}{{^composedSchemas.anyOf}}#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
pub struct {{{classname}}} {
{{#composedSchemas.allOf}}
{{#ref}}
#[serde(flatten)]
pub {{#lambda.snakecase}}{{complexType}}{{/lambda.snakecase}}: {{{dataType}}},
{{/ref}}
{{^ref}}
{{#vars}}
{{>model_field}}
{{/vars}}
{{/ref}}
{{/composedSchemas.allOf}}
{{^composedSchemas.allOf}}
{{#vars}}
{{>model_field}}
{{/vars}}
{{/composedSchemas.allOf}}
}
impl {{{classname}}} {
{{#description}}
/// {{{.}}}
{{/description}}
pub fn new({{#composedSchemas.allOf}}{{#ref}}{{#lambda.snakecase}}{{complexType}}{{/lambda.snakecase}}: {{{dataType}}}, {{/ref}}{{^ref}}{{#vars}}{{#required}}{{{name}}}: {{>model_param}}, {{/required}}{{/vars}}{{/ref}}{{/composedSchemas.allOf}}{{^composedSchemas.allOf}}{{#requiredVars}}{{{name}}}: {{>model_param}}, {{/requiredVars}}{{/composedSchemas.allOf}}) -> {{{classname}}} {
{{{classname}}} {
{{#composedSchemas.allOf}}
{{#ref}}
{{#lambda.snakecase}}{{complexType}}{{/lambda.snakecase}},
{{/ref}}
{{^ref}}
{{#vars}}
{{>model_init}}
{{/vars}}
{{/ref}}
{{/composedSchemas.allOf}}
{{^composedSchemas.allOf}}
{{#vars}}
{{>model_init}}
{{/vars}}
{{/composedSchemas.allOf}}
}
}
}
{{/composedSchemas.anyOf}}
{{/oneOf.isEmpty}}
{{^oneOf.isEmpty}}
{{! TODO: add other vars that are not part of the oneOf}}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum {{classname}} {
{{#composedSchemas.oneOf}}
{{{name}}}({{#isModel}}{{^avoidBoxedModels}}Box<{{/avoidBoxedModels}}{{/isModel}}{{{dataType}}}{{#isModel}}{{^avoidBoxedModels}}>{{/avoidBoxedModels}}{{/isModel}}),
{{/composedSchemas.oneOf}}
}
impl Default for {{classname}} {
fn default() -> Self {
{{#composedSchemas.oneOf}}{{#-first}}Self::{{{name}}}(Default::default()){{/-first}}{{/composedSchemas.oneOf}}
}
}
{{/oneOf.isEmpty}}
{{^anyOf.isEmpty}}
{{! TODO: add other vars that are not part of the anyOf}}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum {{classname}} {
{{#composedSchemas.anyOf}}
{{{nameInPascalCase}}}({{#isModel}}{{^avoidBoxedModels}}Box<{{/avoidBoxedModels}}{{/isModel}}{{{dataType}}}{{#isModel}}{{^avoidBoxedModels}}>{{/avoidBoxedModels}}{{/isModel}}),
{{/composedSchemas.anyOf}}
}
impl Default for {{classname}} {
fn default() -> Self {
{{#composedSchemas.anyOf}}{{#-first}}Self::{{{nameInPascalCase}}}(Default::default()){{/-first}}{{/composedSchemas.anyOf}}
}
}
{{/anyOf.isEmpty}}
{{/discriminator}}
{{/isEnum}}
{{!-- for properties that are of enum type --}}
{{#vars}}
{{#isEnum}}
{{#isInteger}}
{{#description}}
/// {{{description}}}
{{/description}}
#[repr(i64)]
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize_repr, Deserialize_repr)]
pub enum {{{enumName}}} {
{{#allowableValues}}
{{#enumVars}}
{{{name}}} = {{{value}}},
{{/enumVars}}
{{/allowableValues}}
}
impl std::fmt::Display for {{{enumName}}} {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", match self {
{{#allowableValues}}
{{#enumVars}}
Self::{{{name}}} => "{{{value}}}",
{{/enumVars}}
{{/allowableValues}}
})
}
}
{{/isInteger}}
{{^isInteger}}
{{#description}}
/// {{{description}}}
{{/description}}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum {{{enumName}}} {
{{#allowableValues}}
{{#enumVars}}
#[serde(rename = "{{{value}}}")]
{{{name}}},
{{/enumVars}}
{{/allowableValues}}
}
{{/isInteger}}
impl Default for {{{enumName}}} {
fn default() -> {{{enumName}}} {
{{#allowableValues}}
Self::{{ enumVars.0.name }}
{{/allowableValues}}
}
}
{{/isEnum}}
{{/vars}}
{{/model}}
{{/models}}