@@ -129,11 +129,39 @@ object SchemaType {
129129 discriminatorSchema : Schema [D ] = Schema .string,
130130 discriminatorMapping : Map [String , SRef [_]] = Map .empty
131131 ): SCoproduct [T ] = {
132+ // used to add encoded discriminator value attributes
133+ val reverseDiscriminatorByNameMapping : Map [SName , String ] = discriminatorMapping.toList.map { case (v, ref) => (ref.name, v) }.toMap
134+
132135 SCoproduct (
133136 subtypes.map {
134- case s @ Schema (st : SchemaType .SProduct [Any @ unchecked], _, _, _, _, _, _, _, _, _, _)
135- if st.fields.forall(_.name != discriminatorName) =>
136- s.copy(schemaType = st.copy(fields = st.fields :+ SProductField [Any , D ](discriminatorName, discriminatorSchema, _ => None )))
137+ case s @ Schema (st : SchemaType .SProduct [Any @ unchecked], _, _, _, _, _, _, _, _, _, _) =>
138+ // first, ensuring that the discriminator field is added to the schema type - it might already be present
139+ var targetSt =
140+ if (st.fields.forall(_.name != discriminatorName))
141+ st.copy(fields = st.fields :+ SProductField [Any , D ](discriminatorName, discriminatorSchema, _ => None ))
142+ else st
143+
144+ // next, modifying the discriminator field, by adding the value attribute (if a value can be found)
145+ targetSt = targetSt.copy(fields = targetSt.fields.map { field =>
146+ if (field.name == discriminatorName) {
147+ val discriminatorValue = s.name.flatMap { subtypeName =>
148+ reverseDiscriminatorByNameMapping.get(subtypeName)
149+ }
150+
151+ discriminatorValue match {
152+ case Some (v) =>
153+ SProductField (
154+ field.name,
155+ field.schema.attribute(Schema .EncodedDiscriminatorValue .Attribute , Schema .EncodedDiscriminatorValue (v)),
156+ field.get
157+ )
158+ case None => field
159+ }
160+
161+ } else field
162+ })
163+
164+ s.copy(schemaType = targetSt)
137165 case s => s
138166 },
139167 Some (SDiscriminator (discriminatorName, discriminatorMapping))
0 commit comments