oapi-codegen icon indicating copy to clipboard operation
oapi-codegen copied to clipboard

Use discriminator with several mappings for one schema

Open maks56893 opened this issue 1 year ago • 1 comments

I would like to use two schemas in oneOf with discriminator. I have several enum values for each discriminator fields in schemas. So can I use discriminator like this?

ConfigSaveReq:
      oneOf:
      - $ref: "#/components/schemas/ConfigHttp"
      - $ref: "#/components/schemas/ConfigSsh"
      discriminator:
        propertyName: config_type
        mapping:
          ssh_server: "#/components/schemas/ConfigSsh"
          apache_server: "#/components/schemas/ConfigHttp"
          web_server: "#/components/schemas/ConfigHttp"
          another_server: "#/components/schemas/ConfigHttp"

Now after generating types I get switch with only two cases in ValueByDiscriminator(). Furthermore, for case with ConfigHttp variable value selecting randomly from ConfigHttp keys

	switch discriminator {
	case "ssh_server":
		return t.AsConfigSsh()
	case "web_server":
		return t.AsConfigHttp()
	default:
		return nil, errors.New("unknown discriminator value: " + discriminator)
	}

I found this break in generateUnion, if remove it and make len assertion by len(discriminator.Mapping) instead len(elements) my case will work. It is will fine?

		if discriminator != nil {
			if len(discriminator.Mapping) != 0 && element.Ref == "" {
				return errors.New("ambiguous discriminator.mapping: please replace inlined object with $ref")
			}

			// Explicit mapping.
			var mapped bool
			for k, v := range discriminator.Mapping {
				if v == element.Ref {
					outSchema.Discriminator.Mapping[k] = elementSchema.GoType
					mapped = true
					break <------
				}
			}
			// Implicit mapping.
			if !mapped {
				outSchema.Discriminator.Mapping[RefPathToObjName(element.Ref)] = elementSchema.GoType
			}
		}

maks56893 avatar Apr 03 '24 11:04 maks56893

Having this same issue, also finding that the generated code in this case is non-deterministic which adds extra pain for CI stesp trying to ensure that the generated code is up to date

mgabeler-lee-6rs avatar Oct 02 '24 16:10 mgabeler-lee-6rs

Having the same issue. Would love to see it solved 🗡

benazir-sba avatar Jan 17 '25 09:01 benazir-sba

can we see a PR and a merge of this ?

gerhardwagner avatar Jan 17 '25 09:01 gerhardwagner