Prepare generation of create types for tui.
Change-Id: I326156aa1ebfd85ad19bf4f164c0537d236ae204 Signed-off-by: Artem Goncharov <artem.goncharov@gmail.com>
This commit is contained in:
@@ -628,7 +628,7 @@ class HashMapResponse(Dictionary):
|
|||||||
"""Wrapper around a simple dictionary to implement Display trait"""
|
"""Wrapper around a simple dictionary to implement Display trait"""
|
||||||
|
|
||||||
# name: str | None = None
|
# name: str | None = None
|
||||||
lifetimes: set[str] = set()
|
# lifetimes: set[str] = set()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def type_hint(self):
|
def type_hint(self):
|
||||||
|
|||||||
@@ -231,6 +231,17 @@ class Struct(rust_sdk.Struct):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
class StringEnum(common_rust.StringEnum):
|
||||||
|
def get_sdk_setter(
|
||||||
|
self, source_var_name: str, sdk_mod_path: str, into: bool = False
|
||||||
|
) -> str:
|
||||||
|
return f"val.clone().into()"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def derive_container_macros(self) -> str | None:
|
||||||
|
return "#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]"
|
||||||
|
|
||||||
|
|
||||||
class TypeManager(common_rust.TypeManager):
|
class TypeManager(common_rust.TypeManager):
|
||||||
"""Rust SDK type manager
|
"""Rust SDK type manager
|
||||||
|
|
||||||
@@ -253,6 +264,7 @@ class TypeManager(common_rust.TypeManager):
|
|||||||
request_parameter_class: type[common_rust.RequestParameter] = (
|
request_parameter_class: type[common_rust.RequestParameter] = (
|
||||||
common_rust.RequestParameter
|
common_rust.RequestParameter
|
||||||
)
|
)
|
||||||
|
string_enum_class = StringEnum
|
||||||
|
|
||||||
sdk_type_manager: SdkTypeManager | None = None
|
sdk_type_manager: SdkTypeManager | None = None
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
// `openstack-codegenerator`.
|
// `openstack-codegenerator`.
|
||||||
{% import 'rust_macros.j2' as macros with context -%}
|
{% import 'rust_macros.j2' as macros with context -%}
|
||||||
use derive_builder::Builder;
|
use derive_builder::Builder;
|
||||||
use eyre::{Result, WrapErr, Report};
|
use eyre::{Result, WrapErr, Report, eyre};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use tokio::sync::mpsc::UnboundedSender;
|
use tokio::sync::mpsc::UnboundedSender;
|
||||||
@@ -33,7 +33,7 @@ use {{ mod }};
|
|||||||
{%- set sdk_data_type = sdk_type_manager.get_root_data_type() %}
|
{%- set sdk_data_type = sdk_type_manager.get_root_data_type() %}
|
||||||
|
|
||||||
{%- if data_type.__class__.__name__ == "Struct" %}
|
{%- if data_type.__class__.__name__ == "Struct" %}
|
||||||
#[derive(Builder, Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Builder, Clone, Debug, Default, Deserialize, PartialEq, Eq, Serialize)]
|
||||||
#[builder(setter(strip_option))]
|
#[builder(setter(strip_option))]
|
||||||
pub struct {{ class_name }}{
|
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" %}
|
||||||
@@ -51,6 +51,7 @@ pub struct {{ class_name }}{
|
|||||||
Option<{{ param.type_hint }}>,
|
Option<{{ param.type_hint }}>,
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
|
||||||
{%- if data_type["fields"] is defined %}
|
{%- if data_type["fields"] is defined %}
|
||||||
{#- Structure #}
|
{#- Structure #}
|
||||||
@@ -62,13 +63,48 @@ pub struct {{ class_name }}{
|
|||||||
{%- endfor %}
|
{%- endfor %}
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
{%- endfor %}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{%- for type, sdk_type in type_manager.get_subtypes_with_sdk() %}
|
{%- for type, sdk_type in type_manager.get_subtypes_with_sdk() %}
|
||||||
{%- if type["base_type"] == "struct" %}
|
{%- if type["variants"] is defined %}
|
||||||
|
{#- Enum #}
|
||||||
|
{{ macros.docstring(type.description, indent=0) }}
|
||||||
|
#[derive(Clone, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
|
||||||
|
pub enum {{ type.name }} {
|
||||||
|
{%- for k in type.variants.keys()|sort %}
|
||||||
|
{{ type.variant_serde_macros(k) }}
|
||||||
|
{{ k }},
|
||||||
|
{%- endfor %}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TryFrom<String> for {{ type.name }} {
|
||||||
|
type Error = Report;
|
||||||
|
|
||||||
|
fn try_from(value: String) -> Result<Self, Self::Error> {
|
||||||
|
match value.as_str() {
|
||||||
|
{%- for k, vals in type.variants|dictsort %}
|
||||||
|
{%- for val in vals|sort %}
|
||||||
|
"{{val}}" => Ok(Self::{{k}}),
|
||||||
|
{%- endfor %}
|
||||||
|
{%- endfor %}
|
||||||
|
other => Err(eyre!("'{}' is not a valid {{ type.name }}", other)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<{{ type.name }}> for {{ sdk_mod_path | join("::") }}::{{ sdk_type.name }} {
|
||||||
|
fn from(value: {{ type.name }}) -> Self {
|
||||||
|
match value {
|
||||||
|
{%- for k in type.variants.keys()|sort %}
|
||||||
|
{{ type.name }}::{{k}} => Self::{{k}},
|
||||||
|
{%- endfor %}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{%- elif type["base_type"] == "struct" %}
|
||||||
/// {{ type.name }} data
|
/// {{ type.name }} data
|
||||||
#[derive(Builder, Debug, Default, Deserialize, Clone, Eq, PartialEq, Serialize)]
|
#[derive(Builder, Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
|
||||||
#[builder(setter(strip_option))]
|
#[builder(setter(strip_option))]
|
||||||
pub struct {{ type.name }} {
|
pub struct {{ type.name }} {
|
||||||
{%- for _, field in type.fields | dictsort %}
|
{%- for _, field in type.fields | dictsort %}
|
||||||
@@ -118,7 +154,7 @@ impl fmt::Display for {{ class_name }} {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TryFrom<&{{ class_name }}> for RequestBuilder{{ "<'_>" if sdk_type_manager.get_request_static_lifetimes(data_type) else "" }} {
|
impl TryFrom<&{{ class_name }}> for RequestBuilder{{ "<'_>" if sdk_type_manager.get_request_static_lifetimes(sdk_data_type) else "" }} {
|
||||||
type Error = Report;
|
type Error = Report;
|
||||||
fn try_from(value: &{{ class_name }}) -> Result<Self, Self::Error> {
|
fn try_from(value: &{{ class_name }}) -> Result<Self, Self::Error> {
|
||||||
let mut ep_builder = Self::default();
|
let mut ep_builder = Self::default();
|
||||||
@@ -182,7 +218,7 @@ impl ExecuteApiRequest for {{ class_name }} {
|
|||||||
request: request.clone(),
|
request: request.clone(),
|
||||||
data: ep.query_async(session).await?,
|
data: ep.query_async(session).await?,
|
||||||
})?;
|
})?;
|
||||||
{%- elif operation_type in ["action", "set"] %}
|
{%- elif operation_type in ["action", "create", "set"] %}
|
||||||
app_tx.send(Action::ApiResponseData {
|
app_tx.send(Action::ApiResponseData {
|
||||||
request: request.clone(),
|
request: request.clone(),
|
||||||
data: ep.query_async(session).await?,
|
data: ep.query_async(session).await?,
|
||||||
|
|||||||
@@ -3133,6 +3133,8 @@ resources:
|
|||||||
sdk_mod_name: create
|
sdk_mod_name: create
|
||||||
rust-sdk:
|
rust-sdk:
|
||||||
module_name: create
|
module_name: create
|
||||||
|
rust-tui:
|
||||||
|
module_name: create
|
||||||
delete:
|
delete:
|
||||||
operation_id: security-group-rules/id:delete
|
operation_id: security-group-rules/id:delete
|
||||||
operation_type: delete
|
operation_type: delete
|
||||||
|
|||||||
Reference in New Issue
Block a user