diff --git a/codegenerator/common/schema.py b/codegenerator/common/schema.py index 3dce6be..2e9b429 100644 --- a/codegenerator/common/schema.py +++ b/codegenerator/common/schema.py @@ -90,6 +90,7 @@ class ParameterSchema(BaseModel): deprecated: bool = False style: str | None = None explode: bool | None = None + uniqueItems: bool | None = None ref: str = Field(alias="$ref", default=None) openstack: Dict[str, Any] = Field(alias="x-openstack", default=None) diff --git a/codegenerator/model.py b/codegenerator/model.py index 9a4b3cd..d45823a 100644 --- a/codegenerator/model.py +++ b/codegenerator/model.py @@ -764,7 +764,10 @@ class OpenAPISchemaParser(JsonSchemaParser): if style == "form" and not explode: dt = CommaSeparatedList(item_type=ConstraintString()) elif style == "form" and explode: - dt = Set(item_type=ConstraintString()) + if not param_schema.get("uniqueItems", False): + dt = Array(item_type=ConstraintString()) + else: + dt = Set(item_type=ConstraintString()) else: raise NotImplementedError( f"Parameter serialization {schema} not supported" diff --git a/codegenerator/templates/rust_sdk/impl.rs.j2 b/codegenerator/templates/rust_sdk/impl.rs.j2 index 80453f4..c9af0c7 100644 --- a/codegenerator/templates/rust_sdk/impl.rs.j2 +++ b/codegenerator/templates/rust_sdk/impl.rs.j2 @@ -166,18 +166,28 @@ impl{{ type_manager.get_request_static_lifetimes(request) }} RestEndpoint for Re {%- if type_manager.parameters.values()|selectattr("location", "equalto", "query")|list|length > 0 %} let mut params = QueryParams::default(); - {%- for param in type_manager.parameters.values() %} - {%- if param.location == "query" %} + {%- for param in type_manager.parameters.values() %} + {%- if param.location == "query" %} {%- if param.data_type.__class__.__name__ == "Null" %} params.push_opt_key_only( "{{ param.remote_name }}", self.{{ param.local_name }}.as_ref() ); - {%- elif not param.type_hint.startswith("BTreeSet") %} - {%- if param.is_required %} - params.push( + {%- elif param.data_type.__class__.__name__ == "Array" %} + {%- if not param.is_required %} + if let Some(val) = &self.{{ param.local_name }} { + params.extend(val.iter().map(|value| ("{{ param.remote_name }}", value))); + } {%- else %} - params.push_opt( + params.extend(self.{{ param.local_name }}.iter().map(|value| ("{{ param.remote_name }}", value))); + {%- endif %} + {%- elif param.type_hint.startswith("BTreeSet") %} + params.extend(self.{{ param.local_name }}.iter().map(|value| ("{{ param.remote_name }}", value))); + {%- else %} + {%- if param.is_required %} + params.push( + {%- else %} + params.push_opt( {%- endif %} "{{ param.remote_name }}", self.{{ param.local_name}} @@ -185,11 +195,9 @@ impl{{ type_manager.get_request_static_lifetimes(request) }} RestEndpoint for Re .as_ref() {%- endif %} ); - {%- else %} - params.extend(self.{{ param.local_name }}.iter().map(|value| ("{{ param.remote_name }}", value))); {%- endif %} - {%- endif %} - {%- endfor %} + {%- endif %} + {%- endfor %} params {%- else %}