From 043de429621b89772628610887a6cc521fdf047e Mon Sep 17 00:00:00 2001 From: Lukas Simon Date: Fri, 6 Dec 2024 14:35:58 +0100 Subject: [PATCH 1/2] spec: Return array of config files instead of only one on GET /instances/{id} --- flecs/api/openapi.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/flecs/api/openapi.yaml b/flecs/api/openapi.yaml index aca1652a2..c64abdb58 100644 --- a/flecs/api/openapi.yaml +++ b/flecs/api/openapi.yaml @@ -235,6 +235,10 @@ components: format: ipv4 example: 172.21.0.3 instance_detail_config_files: + type: array + items: + $ref: "#/components/schemas/instance_detail_config_file" + instance_detail_config_file: type: object required: - container From 5abd751ef6a1d478bb341007593903adcaa1a056 Mon Sep 17 00:00:00 2001 From: Lukas Simon Date: Fri, 6 Dec 2024 14:50:40 +0100 Subject: [PATCH 2/2] flecsd_server: Regenerate code --- flecsd-axum-server/README.md | 2 +- flecsd-axum-server/src/models.rs | 170 ++++++++++++++++++++++++++++--- 2 files changed, 158 insertions(+), 14 deletions(-) diff --git a/flecsd-axum-server/README.md b/flecsd-axum-server/README.md index c60dff4ba..666f5c9ce 100644 --- a/flecsd-axum-server/README.md +++ b/flecsd-axum-server/README.md @@ -12,7 +12,7 @@ server, you can easily generate a server stub. To see how to make this your own, look here: [README]((https://openapi-generator.tech)) - API version: 2.0.0 -- Build date: 2024-08-26T15:10:10.784675391Z[Etc/UTC] +- Build date: 2024-12-06T13:36:27.341836548Z[Etc/UTC] - Generator version: 7.8.0-SNAPSHOT diff --git a/flecsd-axum-server/src/models.rs b/flecsd-axum-server/src/models.rs index 6d2e13d8f..2766dd347 100644 --- a/flecsd-axum-server/src/models.rs +++ b/flecsd-axum-server/src/models.rs @@ -3572,7 +3572,7 @@ impl std::convert::TryFrom for header::IntoHeaderValue InstanceDetailConfigFiles { - InstanceDetailConfigFiles { container, host } + pub fn new(container: String, host: String) -> InstanceDetailConfigFile { + InstanceDetailConfigFile { container, host } } } -/// Converts the InstanceDetailConfigFiles value to the Query Parameters representation (style=form, explode=false) +/// Converts the InstanceDetailConfigFile value to the Query Parameters representation (style=form, explode=false) /// specified in https://swagger.io/docs/specification/serialization/ /// Should be implemented in a serde serializer -impl std::fmt::Display for InstanceDetailConfigFiles { +impl std::fmt::Display for InstanceDetailConfigFile { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let params: Vec> = vec![ Some("container".to_string()), @@ -3607,10 +3607,10 @@ impl std::fmt::Display for InstanceDetailConfigFiles { } } -/// Converts Query Parameters representation (style=form, explode=false) to a InstanceDetailConfigFiles value +/// Converts Query Parameters representation (style=form, explode=false) to a InstanceDetailConfigFile value /// as specified in https://swagger.io/docs/specification/serialization/ /// Should be implemented in a serde deserializer -impl std::str::FromStr for InstanceDetailConfigFiles { +impl std::str::FromStr for InstanceDetailConfigFile { type Err = String; fn from_str(s: &str) -> std::result::Result { @@ -3633,7 +3633,7 @@ impl std::str::FromStr for InstanceDetailConfigFiles { Some(x) => x, None => { return std::result::Result::Err( - "Missing value while parsing InstanceDetailConfigFiles".to_string(), + "Missing value while parsing InstanceDetailConfigFile".to_string(), ) } }; @@ -3651,7 +3651,7 @@ impl std::str::FromStr for InstanceDetailConfigFiles { ), _ => { return std::result::Result::Err( - "Unexpected key while parsing InstanceDetailConfigFiles".to_string(), + "Unexpected key while parsing InstanceDetailConfigFile".to_string(), ) } } @@ -3662,21 +3662,165 @@ impl std::str::FromStr for InstanceDetailConfigFiles { } // Use the intermediate representation to return the struct - std::result::Result::Ok(InstanceDetailConfigFiles { + std::result::Result::Ok(InstanceDetailConfigFile { container: intermediate_rep .container .into_iter() .next() - .ok_or_else(|| "container missing in InstanceDetailConfigFiles".to_string())?, + .ok_or_else(|| "container missing in InstanceDetailConfigFile".to_string())?, host: intermediate_rep .host .into_iter() .next() - .ok_or_else(|| "host missing in InstanceDetailConfigFiles".to_string())?, + .ok_or_else(|| "host missing in InstanceDetailConfigFile".to_string())?, }) } } +// Methods for converting between header::IntoHeaderValue and HeaderValue + +#[cfg(feature = "server")] +impl std::convert::TryFrom> for HeaderValue { + type Error = String; + + fn try_from( + hdr_value: header::IntoHeaderValue, + ) -> std::result::Result { + let hdr_value = hdr_value.to_string(); + match HeaderValue::from_str(&hdr_value) { + std::result::Result::Ok(value) => std::result::Result::Ok(value), + std::result::Result::Err(e) => std::result::Result::Err(format!( + "Invalid header value for InstanceDetailConfigFile - value: {} is invalid {}", + hdr_value, e + )), + } + } +} + +#[cfg(feature = "server")] +impl std::convert::TryFrom for header::IntoHeaderValue { + type Error = String; + + fn try_from(hdr_value: HeaderValue) -> std::result::Result { + match hdr_value.to_str() { + std::result::Result::Ok(value) => { + match ::from_str(value) { + std::result::Result::Ok(value) => { + std::result::Result::Ok(header::IntoHeaderValue(value)) + } + std::result::Result::Err(err) => std::result::Result::Err(format!( + "Unable to convert header value '{}' into InstanceDetailConfigFile - {}", + value, err + )), + } + } + std::result::Result::Err(e) => std::result::Result::Err(format!( + "Unable to convert header: {:?} to string: {}", + hdr_value, e + )), + } + } +} + +#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] +#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))] +pub struct InstanceDetailConfigFiles(Vec); + +impl validator::Validate for InstanceDetailConfigFiles { + fn validate(&self) -> std::result::Result<(), validator::ValidationErrors> { + std::result::Result::Ok(()) + } +} + +impl std::convert::From> for InstanceDetailConfigFiles { + fn from(x: Vec) -> Self { + InstanceDetailConfigFiles(x) + } +} + +impl std::convert::From for Vec { + fn from(x: InstanceDetailConfigFiles) -> Self { + x.0 + } +} + +impl std::iter::FromIterator for InstanceDetailConfigFiles { + fn from_iter>(u: U) -> Self { + InstanceDetailConfigFiles(Vec::::from_iter(u)) + } +} + +impl std::iter::IntoIterator for InstanceDetailConfigFiles { + type Item = InstanceDetailConfigFile; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl<'a> std::iter::IntoIterator for &'a InstanceDetailConfigFiles { + type Item = &'a InstanceDetailConfigFile; + type IntoIter = std::slice::Iter<'a, InstanceDetailConfigFile>; + + fn into_iter(self) -> Self::IntoIter { + self.0.iter() + } +} + +impl<'a> std::iter::IntoIterator for &'a mut InstanceDetailConfigFiles { + type Item = &'a mut InstanceDetailConfigFile; + type IntoIter = std::slice::IterMut<'a, InstanceDetailConfigFile>; + + fn into_iter(self) -> Self::IntoIter { + self.0.iter_mut() + } +} + +impl std::ops::Deref for InstanceDetailConfigFiles { + type Target = Vec; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl std::ops::DerefMut for InstanceDetailConfigFiles { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +/// Converts the InstanceDetailConfigFiles value to the Query Parameters representation (style=form, explode=false) +/// specified in https://swagger.io/docs/specification/serialization/ +/// Should be implemented in a serde serializer +impl std::fmt::Display for InstanceDetailConfigFiles { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}", + self.iter() + .map(|x| x.to_string()) + .collect::>() + .join(",") + ) + } +} + +/// Converts Query Parameters representation (style=form, explode=false) to a InstanceDetailConfigFiles value +/// as specified in https://swagger.io/docs/specification/serialization/ +/// Should be implemented in a serde deserializer +impl std::str::FromStr for InstanceDetailConfigFiles { + type Err = ::Err; + + fn from_str(s: &str) -> std::result::Result { + let mut items = vec![]; + for item in s.split(',') { + items.push(item.parse()?); + } + std::result::Result::Ok(InstanceDetailConfigFiles(items)) + } +} + // Methods for converting between header::IntoHeaderValue and HeaderValue #[cfg(feature = "server")]