Files
codegenerator/codegenerator/templates/rust_cli/set_body_parameters.j2
Artem Goncharov aa4d9e16b1 Replace use of unwrap and expect in generated rust code
In order to eliminate rust sdk/cli/tui runtime panics we must get rid of
`unwrap` and `expect` use (in tests it can stay). Lot of not generated
code was already cleaned and now we need to address what is produced by
the generator.

Change-Id: Id9782fb947c61c64fc88bd743596e9996fa56b44
Signed-off-by: Artem Goncharov <artem.goncharov@gmail.com>
2025-11-15 11:25:59 +01:00

100 lines
3.8 KiB
Django/Jinja

{% import 'rust_macros.j2' as macros with context -%}
{% if not is_json_patch -%}
{%- with root = type_manager.get_root_data_type() %}
{%- if root.__class__.__name__ == "StructInput" and root.fields -%}
// Set body parameters
{%- for root_attr, root_field in root.fields | dictsort %}
// Set Request.{{ root_field.remote_name }} data
{%- if root_field.data_type.__class__.__name__ == "StructInput" -%}
{%- if root_field.is_optional %}
if let Some(args) = &self.{{ root_field.local_name }} {
{%- else %}
let args = &self.{{ root_field.local_name }};
{%- endif %}
{%- set builder_name = root_field.local_name + "_builder" %}
let mut {{ builder_name }} = {{ sdk_mod_path[-1] }}::{{ root_field.data_type.name }}Builder::default();
{%- for k, v in root_field.data_type.fields.items() %}
{%- if v.is_optional %}
if let Some(val) = &args.{{ v.local_name }} {
{{ macros.set_request_data_from_input(type_manager, builder_name, v, "val") }}
}
{%- if v.is_nullable and v.data_type.__class__.__name__ in ["String", "Boolean", "Number", "Integer"] %}
else if args.no_{{ v.local_name }} {
{{ builder_name }}.{{ v.local_name }}(None);
}
{%- endif %}
{%- elif v.data_type.format is defined and v.data_type.format == "password" %}
if let Some(val) = &args.{{ v.local_name }} {
{# val.clone() is necessary due to SecretBox not implementing From<&String> #}
{{ builder_name }}.{{ v.remote_name }}(val.clone());
} else {
let secret = Password::new()
{%- if v.description %}
.with_prompt("{{ v.description|trim |trim('.')}}")
{%- else %}
.with_prompt("{{ k }}")
{%- endif %}
.interact()?;
{{ builder_name }}.{{ v.remote_name }}(secret.to_string());
}
{%- else %}
{{ macros.set_request_data_from_input(type_manager, builder_name, v, "&args." + v.local_name) }}
{%- endif %}
{% endfor %}
ep_builder.{{ root_field.remote_name }}({{ builder_name }}.build().wrap_err("error preparing the request data")?);
{% if root_field.is_optional %}
}
{%- endif %}
{%- else %}
{%- if root_field.is_optional %}
if let Some(arg) = &self.{{ root_field.local_name }} {
{{ macros.set_request_data_from_input(type_manager, "ep_builder", root_field, "arg") }}
}
{%- else -%}
{{ macros.set_request_data_from_input(type_manager, "ep_builder", root_field, "&self." + root_field.local_name) }}
{%- endif %}
{%- endif %}
{% endfor %}
{%- if root.additional_fields_type %}
if let Some(properties) = &self.properties {
ep_builder.properties(properties.iter().cloned());
}
{%- endif %}
{%- elif root.__class__.__name__ == "DictionaryInput" %}
// Set body parameters
if let Some(properties) = &self.properties {
{%- if root.value_type.__class__.__name__ == "Option" %}
ep_builder.properties(properties
.into_iter()
.map(|(k, v)| (k, v.as_ref().map(Into::into))),
);
{%- else %}
{%- set original_type = root.value_type.original_data_type %}
{%- if root.value_type.__class__.__name__ == "JsonValue" and original_type.__class__.__name__ == "StructInput" %}
{#- Placement hacks #}
ep_builder.properties(
properties
.into_iter()
.map(|(k, v)| {
serde_json::from_value(v.to_owned()).map(|v: {{ sdk_mod_path[-1] }}::{{ original_type.name }}| (k, v))
})
.collect::<Result<Vec<_>, _>>()?
.into_iter(),
);
{%- else %}
ep_builder.properties(properties.iter().cloned());
{%- endif %}
{%- endif %}
}
{%- endif %}
{%- endwith %}
{%- endif %}