@@ -751,17 +751,38 @@ impl std::str::FromStr for {{{classname}}} {
751751{{^arrayModelType}}
752752{{! general struct}}
753753{{#anyOf.size}}
754- /// Any of:
755- {{#anyOf}}
756- /// - {{{.}}}
757- {{/anyOf}}
758- #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
759- pub struct {{{classname}}}(Box<serde_json::value::RawValue>);
754+ {{#discriminator}}
755+ #[derive(Debug, Clone, PartialEq, serde::Deserialize, derive_more::From)]
756+ #[serde(tag = "{{{propertyBaseName}}}")]
757+ {{/discriminator}}
758+ {{^discriminator}}
759+ #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, derive_more::From)]
760+ #[serde(untagged)]
761+ {{/discriminator}}
762+ #[allow(non_camel_case_types)]
763+ pub enum {{{classname}}} {
764+ {{#composedSchemas}}
765+ {{#anyOf}}
766+ {{{datatypeWithEnum}}}({{{dataType}}}),
767+ {{/anyOf}}
768+ {{/composedSchemas}}
769+ }
760770
761771impl validator::Validate for {{{classname}}}
762772{
763773 fn validate(&self) -> std::result::Result<(), validator::ValidationErrors> {
764- std::result::Result::Ok(())
774+ match self {
775+ {{#composedSchemas}}
776+ {{#anyOf}}
777+ {{^isModel}}
778+ Self::{{{datatypeWithEnum}}}(_) => std::result::Result::Ok(()),
779+ {{/isModel}}
780+ {{#isModel}}
781+ Self::{{{datatypeWithEnum}}}(v) => v.validate(),
782+ {{/isModel}}
783+ {{/anyOf}}
784+ {{/composedSchemas}}
785+ }
765786 }
766787}
767788
@@ -776,27 +797,21 @@ impl std::str::FromStr for {{{classname}}} {
776797 }
777798}
778799
779- impl PartialEq for {{{classname}}} {
780- fn eq(&self, other: &Self) -> bool {
781- self.0.get() == other.0.get()
782- }
783- }
784-
785800{{/anyOf.size}}
786801{{#oneOf.size}}
787802{{#discriminator}}
788- #[derive(Debug, Clone, PartialEq, serde::Deserialize)]
803+ #[derive(Debug, Clone, PartialEq, serde::Deserialize, derive_more::From )]
789804#[serde(tag = "{{{propertyBaseName}}}")]
790805{{/discriminator}}
791806{{^discriminator}}
792- #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
807+ #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, derive_more::From )]
793808#[serde(untagged)]
794809{{/discriminator}}
795810#[allow(non_camel_case_types)]
796811pub enum {{{classname}}} {
797812 {{#composedSchemas}}
798813 {{#oneOf}}
799- {{{datatypeWithEnum}}}(Box< {{{dataType}}}> ),
814+ {{{datatypeWithEnum}}}({{{dataType}}}),
800815 {{/oneOf}}
801816 {{/composedSchemas}}
802817}
@@ -806,14 +821,14 @@ impl validator::Validate for {{{classname}}}
806821 fn validate(&self) -> std::result::Result<(), validator::ValidationErrors> {
807822 match self {
808823 {{#composedSchemas}}
809- {{#oneOf }}
810- {{#isPrimitiveType }}
824+ {{#anyOf }}
825+ {{^isModel }}
811826 Self::{{{datatypeWithEnum}}}(_) => std::result::Result::Ok(()),
812- {{/isPrimitiveType }}
813- {{^isPrimitiveType }}
814- Self::{{{datatypeWithEnum}}}(x ) => x .validate(),
815- {{/isPrimitiveType }}
816- {{/oneOf }}
827+ {{/isModel }}
828+ {{#isModel }}
829+ Self::{{{datatypeWithEnum}}}(v ) => v .validate(),
830+ {{/isModel }}
831+ {{/anyOf }}
817832 {{/composedSchemas}}
818833 }
819834 }
@@ -834,17 +849,68 @@ impl serde::Serialize for {{{classname}}} {
834849}
835850{{/discriminator}}
836851
852+ /// Converts Query Parameters representation (style=form, explode=false) to a {{{classname}}} value
853+ /// as specified in https://swagger.io/docs/specification/serialization/
854+ /// Should be implemented in a serde deserializer
855+ impl std::str::FromStr for {{{classname}}} {
856+ type Err = serde_json::Error;
857+
858+ fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
859+ serde_json::from_str(s)
860+ }
861+ }
862+
863+ {{/oneOf.size}}
864+ {{#allOf.size}}
865+ {{#discriminator}}
866+ #[derive(Debug, Clone, PartialEq, serde::Deserialize, derive_more::From)]
867+ #[serde(tag = "{{{propertyBaseName}}}")]
868+ {{/discriminator}}
869+ {{^discriminator}}
870+ #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, derive_more::From)]
871+ #[serde(untagged)]
872+ {{/discriminator}}
873+ #[allow(non_camel_case_types)]
874+ pub enum {{{classname}}} {
875+ {{#composedSchemas}}
876+ {{#allOf}}
877+ {{{datatypeWithEnum}}}({{{dataType}}}),
878+ {{/allOf}}
879+ {{/composedSchemas}}
880+ }
837881
882+ impl validator::Validate for {{{classname}}}
883+ {
884+ fn validate(&self) -> std::result::Result<(), validator::ValidationErrors> {
885+ match self {
886+ {{#composedSchemas}}
887+ {{#allOf}}
888+ {{^isModel}}
889+ Self::{{{datatypeWithEnum}}}(_) => std::result::Result::Ok(()),
890+ {{/isModel}}
891+ {{#isModel}}
892+ Self::{{{datatypeWithEnum}}}(v) => v.validate(),
893+ {{/isModel}}
894+ {{/allOf}}
895+ {{/composedSchemas}}
896+ }
897+ }
898+ }
838899
839- {{#composedSchemas}}
840- {{#oneOf}}
841- impl From<{{{dataType}}}> for {{{classname}}} {
842- fn from(value: {{{dataType}}}) -> Self {
843- Self::{{{datatypeWithEnum}}}(Box::new(value))
900+ {{#discriminator}}
901+ impl serde::Serialize for {{{classname}}} {
902+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
903+ where S: serde::Serializer {
904+ match self {
905+ {{#composedSchemas}}
906+ {{#allOf}}
907+ Self::{{{datatypeWithEnum}}}(x) => x.serialize(serializer),
908+ {{/allOf}}
909+ {{/composedSchemas}}
910+ }
844911 }
845912}
846- {{/oneOf}}
847- {{/composedSchemas}}
913+ {{/discriminator}}
848914
849915/// Converts Query Parameters representation (style=form, explode=false) to a {{{classname}}} value
850916/// as specified in https://swagger.io/docs/specification/serialization/
@@ -857,9 +923,10 @@ impl std::str::FromStr for {{{classname}}} {
857923 }
858924}
859925
860- {{/oneOf .size}}
926+ {{/allOf .size}}
861927{{^anyOf.size}}
862928{{^oneOf.size}}
929+ {{^allOf.size}}
863930#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, validator::Validate)]
864931#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))]
865932pub struct {{{classname}}} {
@@ -989,7 +1056,6 @@ pub struct {{{classname}}} {
9891056{{/vars}}
9901057}
9911058
992-
9931059{{#vars}}
9941060{{#isDiscriminator}}
9951061impl {{{classname}}} {
@@ -1007,7 +1073,6 @@ impl {{{classname}}} {
10071073{{/isDiscriminator}}
10081074{{/vars}}
10091075
1010-
10111076{{#vars}}
10121077{{#hasValidation}}
10131078{{#pattern}}
@@ -1189,12 +1254,14 @@ impl std::str::FromStr for {{{classname}}} {
11891254 })
11901255 }
11911256}
1257+ { {/allOf.size} }
11921258{ {/oneOf.size} }
11931259{ {/anyOf.size} }
11941260{ {/arrayModelType} }
11951261
11961262{ {^anyOf.size} }
11971263{ {^oneOf.size} }
1264+ { {^allOf.size} }
11981265// Methods for converting between header::IntoHeaderValue<{ {{classname} }}> and HeaderValue
11991266
12001267#[cfg(feature = "server")]
@@ -1226,7 +1293,7 @@ impl std::convert::TryFrom<HeaderValue> for header::IntoHeaderValue<{{{classname
12261293 }
12271294 }
12281295}
1229-
1296+ { {/allOf.size } }
12301297{ {/oneOf.size} }
12311298{ {/anyOf.size} }
12321299
0 commit comments