diff --git a/codegenerator/rust_tui.py b/codegenerator/rust_tui.py index be0eacd..7a5bbf8 100644 --- a/codegenerator/rust_tui.py +++ b/codegenerator/rust_tui.py @@ -28,6 +28,10 @@ class String(common_rust.String): type_hint: str = "String" +class ArrayInput(common_rust.Array): + pass + + class TypeManager(common_rust.TypeManager): """Rust SDK type manager @@ -41,7 +45,11 @@ class TypeManager(common_rust.TypeManager): model.ConstraintString: String, } - data_type_mapping = {model.Struct: common_rust.Struct} + data_type_mapping = { + model.Struct: common_rust.Struct, + model.Array: ArrayInput, + model.CommaSeparatedList: ArrayInput, + } request_parameter_class: Type[common_rust.RequestParameter] = ( common_rust.RequestParameter diff --git a/codegenerator/templates/rust_macros.j2 b/codegenerator/templates/rust_macros.j2 index 0697a05..b2f5d63 100644 --- a/codegenerator/templates/rust_macros.j2 +++ b/codegenerator/templates/rust_macros.j2 @@ -172,7 +172,7 @@ Some({{ val }}) {{ dst_var }}.{{ param.remote_name }}({{ val_var | replace("&", "" )}}); {%- elif param.data_type.__class__.__name__ in ["ArrayInput"] %} - {{ sdk_plain_array_setter(param, val_var.replace("&", ""), dst_var) }} + {{ sdk_plain_array_setter(param, val_var.replace("&", ""), dst_var, by_ref=by_ref) }} {%- elif param.data_type.__class__.__name__ in ["JsonValue"] %} @@ -342,7 +342,7 @@ Some({{ val }}) {%- endif %} {%- endmacro %} -{%- macro sdk_plain_array_setter(param, val_var, dst_var) %} +{%- macro sdk_plain_array_setter(param, val_var, dst_var, by_ref=False) %} {%- set original_type = param.data_type.original_data_type %} {%- set original_item_type = param.data_type.item_type.original_data_type %} {%- if param.data_type.item_type.__class__.__name__ == "JsonValue" and original_type.__class__.__name__ == "StructInput" %} @@ -377,7 +377,7 @@ Some({{ val }}) {%- elif param["setter_type"] is defined %} {#- Param with setter present #} {{ dst_var }}.{{ param.remote_name }}( - {{ val_var }}.iter() + {{ val_var }}{{ ".iter()" if not by_ref else ".into_iter().cloned()" }} ); {%- elif original_item_type and original_item_type.__class__.__name__ == "DictionaryInput" %} use std::collections::BTreeMap; diff --git a/codegenerator/templates/rust_tui/impl.rs.j2 b/codegenerator/templates/rust_tui/impl.rs.j2 index 7bbbbf3..3444e30 100644 --- a/codegenerator/templates/rust_tui/impl.rs.j2 +++ b/codegenerator/templates/rust_tui/impl.rs.j2 @@ -34,10 +34,9 @@ use {{ mod }}; {%- if data_type.__class__.__name__ == "Struct" %} #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct {{ class_name }}{ -{%- for name, param in type_manager.parameters | dictsort %} - {%- if param.location != "header" %} +{%- for name, param in type_manager.parameters|dictsort if param.location != "header" %} {{ param.local_name }}: {{ param.type_hint }}, - {%- if param.local_name.endswith("id") %} + {%- if param.local_name.endswith("id") and (param.local_name[:-2] + "name") not in type_manager.parameters.keys() %} {%- set param_type = False %} {{ param.local_name[:-2] }}name: {%- if param.type_hint.startswith("Option") %} @@ -46,7 +45,6 @@ pub struct {{ class_name }}{ Option<{{ param.type_hint }}>, {%- endif %} {%- endif %} - {%- endif %} {%- endfor %} } @@ -55,16 +53,18 @@ impl fmt::Display for {{ class_name }} { let mut parts: Vec = Vec::new(); {%- for name, param in type_manager.parameters | dictsort %} {%- if param.location != "header" %} - {%- if param.local_name.endswith("_id") %} - {%- set alt_name = param.local_name.replace("_id", "_name") %} + {%- if param.local_name.endswith("id") %} + {%- set alt_name = param.local_name[:-2] + "name" %} {%- if param.type_hint.startswith("Option") %} if self.{{ param.local_name }}.is_some() || self.{{ alt_name }}.is_some() { parts.push(format!( - "{{ param.local_name[:-3] }}: {}", + "{{ param.local_name[:-3] or "name/id" }}: {}", self.{{ alt_name }} .as_ref() .or(self.{{ param.local_name }}.as_ref()) - .unwrap_or(&String::new()) + .unwrap_or( + &{{ param.data_type.type_hint }}::default() + ) )); } {% else %} @@ -152,7 +152,15 @@ impl ConfirmableRequest for {{ class_name }} { fn get_confirm_message(&self) -> Option { Some(format!( "Delete {{ sdk_service_name }} {{ resource_name.title() }} {} ?", +{%- if "id" in dict(type_manager.get_parameters("path")).keys() %} self.name.clone().unwrap_or(self.id.clone()) +{%- else %} + {%- for (k, v) in type_manager.get_parameters("path") %} + {%- if k.endswith("id") %} + self.{{ k[:-2] }}name.clone().unwrap_or(self.{{ k[:-2] }}id.clone()) + {%- endif %} + {%- endfor %} +{%- endif %} )) } }