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>
100 lines
3.8 KiB
Django/Jinja
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 %}
|