Commit b6efc392 authored by Nugine's avatar Nugine
Browse files

feat(s3s/xml): support xmlns

parent 9df99367
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -121,6 +121,10 @@ pub fn is_op_input(name: &str, ops: &Operations) -> bool {
    name.strip_suffix("Input").is_some_and(|x| ops.contains_key(x))
}

pub fn is_op_output(name: &str, ops: &Operations) -> bool {
    name.strip_suffix("Output").is_some_and(|x| ops.contains_key(x))
}

pub fn codegen(ops: &Operations, rust_types: &RustTypes) {
    declare_codegen!();

+9 −1
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ use super::rust;
use super::rust::default_value_literal;

use crate::declare_codegen;
use crate::v1::ops::is_op_output;

use std::collections::{BTreeMap, BTreeSet, VecDeque};
use std::ops::Not;
@@ -58,6 +59,9 @@ pub fn codegen(ops: &Operations, rust_types: &RustTypes) {
    }
    g!();

    g!("const XMLNS_S3: &str = \"http://s3.amazonaws.com/doc/2006-03-01/\";");
    g!();

    codegen_xml_serde(ops, rust_types, &root_type_names);
    codegen_xml_serde_content(ops, rust_types, &field_type_names);
}
@@ -223,7 +227,11 @@ fn codegen_xml_serde(ops: &Operations, rust_types: &RustTypes, root_type_names:
            g!("impl Serialize for {} {{", ty.name);
            g!("fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {{");

            if is_op_output(&ty.name, ops) {
                g!("s.content_with_ns(\"{xml_name}\", XMLNS_S3, self)");
            } else {
                g!("s.content(\"{xml_name}\", self)");
            }

            g!("}}");
            g!("}}");
+28 −26
Original line number Diff line number Diff line
@@ -806,6 +806,8 @@ use std::io::Write;
//   SerializeContent: Years
// DeserializeContent: Years

const XMLNS_S3: &str = "http://s3.amazonaws.com/doc/2006-03-01/";

impl Serialize for AccelerateConfiguration {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("AccelerateConfiguration", self)
@@ -880,7 +882,7 @@ impl<'xml> Deserialize<'xml> for CORSConfiguration {

impl Serialize for CompleteMultipartUploadOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("CompleteMultipartUploadResult", self)
        s.content_with_ns("CompleteMultipartUploadResult", XMLNS_S3, self)
    }
}

@@ -934,7 +936,7 @@ impl<'xml> Deserialize<'xml> for CreateBucketConfiguration {

impl Serialize for CreateMultipartUploadOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("InitiateMultipartUploadResult", self)
        s.content_with_ns("InitiateMultipartUploadResult", XMLNS_S3, self)
    }
}

@@ -952,19 +954,19 @@ impl<'xml> Deserialize<'xml> for Delete {

impl Serialize for DeleteObjectsOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("DeleteResult", self)
        s.content_with_ns("DeleteResult", XMLNS_S3, self)
    }
}

impl Serialize for GetBucketAccelerateConfigurationOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("AccelerateConfiguration", self)
        s.content_with_ns("AccelerateConfiguration", XMLNS_S3, self)
    }
}

impl Serialize for GetBucketAclOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("AccessControlPolicy", self)
        s.content_with_ns("AccessControlPolicy", XMLNS_S3, self)
    }
}

@@ -976,7 +978,7 @@ impl<'xml> Deserialize<'xml> for GetBucketAclOutput {

impl Serialize for GetBucketCorsOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("CORSConfiguration", self)
        s.content_with_ns("CORSConfiguration", XMLNS_S3, self)
    }
}

@@ -988,13 +990,13 @@ impl<'xml> Deserialize<'xml> for GetBucketCorsOutput {

impl Serialize for GetBucketLifecycleConfigurationOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("LifecycleConfiguration", self)
        s.content_with_ns("LifecycleConfiguration", XMLNS_S3, self)
    }
}

impl Serialize for GetBucketLoggingOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("BucketLoggingStatus", self)
        s.content_with_ns("BucketLoggingStatus", XMLNS_S3, self)
    }
}

@@ -1018,7 +1020,7 @@ impl<'xml> Deserialize<'xml> for GetBucketMetadataTableConfigurationResult {

impl Serialize for GetBucketNotificationConfigurationOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("NotificationConfiguration", self)
        s.content_with_ns("NotificationConfiguration", XMLNS_S3, self)
    }
}

@@ -1030,7 +1032,7 @@ impl<'xml> Deserialize<'xml> for GetBucketNotificationConfigurationOutput {

impl Serialize for GetBucketRequestPaymentOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("RequestPaymentConfiguration", self)
        s.content_with_ns("RequestPaymentConfiguration", XMLNS_S3, self)
    }
}

@@ -1042,7 +1044,7 @@ impl<'xml> Deserialize<'xml> for GetBucketRequestPaymentOutput {

impl Serialize for GetBucketTaggingOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("Tagging", self)
        s.content_with_ns("Tagging", XMLNS_S3, self)
    }
}

@@ -1054,7 +1056,7 @@ impl<'xml> Deserialize<'xml> for GetBucketTaggingOutput {

impl Serialize for GetBucketVersioningOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("VersioningConfiguration", self)
        s.content_with_ns("VersioningConfiguration", XMLNS_S3, self)
    }
}

@@ -1066,7 +1068,7 @@ impl<'xml> Deserialize<'xml> for GetBucketVersioningOutput {

impl Serialize for GetBucketWebsiteOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("WebsiteConfiguration", self)
        s.content_with_ns("WebsiteConfiguration", XMLNS_S3, self)
    }
}

@@ -1078,19 +1080,19 @@ impl<'xml> Deserialize<'xml> for GetBucketWebsiteOutput {

impl Serialize for GetObjectAclOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("AccessControlPolicy", self)
        s.content_with_ns("AccessControlPolicy", XMLNS_S3, self)
    }
}

impl Serialize for GetObjectAttributesOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("GetObjectAttributesResponse", self)
        s.content_with_ns("GetObjectAttributesResponse", XMLNS_S3, self)
    }
}

impl Serialize for GetObjectTaggingOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("Tagging", self)
        s.content_with_ns("Tagging", XMLNS_S3, self)
    }
}

@@ -1120,7 +1122,7 @@ impl<'xml> Deserialize<'xml> for InventoryConfiguration {

impl Serialize for ListBucketAnalyticsConfigurationsOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("ListBucketAnalyticsConfigurationResult", self)
        s.content_with_ns("ListBucketAnalyticsConfigurationResult", XMLNS_S3, self)
    }
}

@@ -1132,7 +1134,7 @@ impl<'xml> Deserialize<'xml> for ListBucketAnalyticsConfigurationsOutput {

impl Serialize for ListBucketIntelligentTieringConfigurationsOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("ListBucketIntelligentTieringConfigurationsOutput", self)
        s.content_with_ns("ListBucketIntelligentTieringConfigurationsOutput", XMLNS_S3, self)
    }
}

@@ -1144,7 +1146,7 @@ impl<'xml> Deserialize<'xml> for ListBucketIntelligentTieringConfigurationsOutpu

impl Serialize for ListBucketInventoryConfigurationsOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("ListInventoryConfigurationsResult", self)
        s.content_with_ns("ListInventoryConfigurationsResult", XMLNS_S3, self)
    }
}

@@ -1156,7 +1158,7 @@ impl<'xml> Deserialize<'xml> for ListBucketInventoryConfigurationsOutput {

impl Serialize for ListBucketMetricsConfigurationsOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("ListMetricsConfigurationsResult", self)
        s.content_with_ns("ListMetricsConfigurationsResult", XMLNS_S3, self)
    }
}

@@ -1168,7 +1170,7 @@ impl<'xml> Deserialize<'xml> for ListBucketMetricsConfigurationsOutput {

impl Serialize for ListBucketsOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("ListAllMyBucketsResult", self)
        s.content_with_ns("ListAllMyBucketsResult", XMLNS_S3, self)
    }
}

@@ -1180,31 +1182,31 @@ impl<'xml> Deserialize<'xml> for ListBucketsOutput {

impl Serialize for ListMultipartUploadsOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("ListMultipartUploadsResult", self)
        s.content_with_ns("ListMultipartUploadsResult", XMLNS_S3, self)
    }
}

impl Serialize for ListObjectVersionsOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("ListVersionsResult", self)
        s.content_with_ns("ListVersionsResult", XMLNS_S3, self)
    }
}

impl Serialize for ListObjectsOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("ListBucketResult", self)
        s.content_with_ns("ListBucketResult", XMLNS_S3, self)
    }
}

impl Serialize for ListObjectsV2Output {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("ListBucketResult", self)
        s.content_with_ns("ListBucketResult", XMLNS_S3, self)
    }
}

impl Serialize for ListPartsOutput {
    fn serialize<W: Write>(&self, s: &mut Serializer<W>) -> SerResult {
        s.content("ListPartsResult", self)
        s.content_with_ns("ListPartsResult", XMLNS_S3, self)
    }
}

+7 −19
Original line number Diff line number Diff line
@@ -11,19 +11,16 @@ mod generated;
mod manually {
    use super::*;

    use quick_xml::events::BytesEnd;
    use quick_xml::events::BytesStart;
    use quick_xml::events::Event;

    use crate::dto::BucketLocationConstraint;
    use crate::dto::GetBucketLocationOutput;

    impl Serialize for GetBucketLocationOutput {
        fn serialize<W: std::io::Write>(&self, s: &mut Serializer<W>) -> SerResult {
            let xmlns = "http://s3.amazonaws.com/doc/2006-03-01/";
            if let Some(location_constraint) = &self.location_constraint {
                s.content("LocationConstraint", location_constraint)?;
                s.content_with_ns("LocationConstraint", xmlns, location_constraint)?;
            } else {
                s.content("LocationConstraint", "")?;
                s.content_with_ns("LocationConstraint", xmlns, "")?;
            }
            Ok(())
        }
@@ -53,9 +50,10 @@ mod manually {

    impl Serialize for AssumeRoleOutput {
        fn serialize<W: std::io::Write>(&self, s: &mut Serializer<W>) -> SerResult {
            s.event(start_with_ns("AssumeRoleResponse", "https://sts.amazonaws.com/doc/2011-06-15/"))?;
            s.content("AssumeRoleResult", self)?;
            s.event(end("AssumeRoleResponse"))?;
            let xmlns = "https://sts.amazonaws.com/doc/2011-06-15/";
            s.element_with_ns("AssumeRoleResponse", xmlns, |s| {
                s.content("AssumeRoleResult", self) //
            })?;
            Ok(())
        }
    }
@@ -67,14 +65,4 @@ mod manually {
            })
        }
    }

    fn start_with_ns<'a>(name: &'a str, ns: &'a str) -> Event<'a> {
        let mut e = BytesStart::new(name);
        e.push_attribute(("xmlns", ns));
        Event::Start(e)
    }

    fn end(name: &str) -> Event<'_> {
        Event::End(BytesEnd::new(name))
    }
}
+16 −0
Original line number Diff line number Diff line
@@ -66,6 +66,12 @@ impl<W: Write> Serializer<W> {
        self.event(end(name))
    }

    pub fn element_with_ns(&mut self, name: &str, xmlns: &str, f: impl FnOnce(&mut Self) -> SerResult) -> SerResult {
        self.event(start_with_ns(name, xmlns))?;
        f(self)?;
        self.event(end(name))
    }

    /// Serializes a type
    ///
    /// # Errors
@@ -74,6 +80,10 @@ impl<W: Write> Serializer<W> {
        self.element(name, |s| val.serialize_content(s))
    }

    pub fn content_with_ns<T: SerializeContent + ?Sized>(&mut self, name: &str, xmlns: &str, val: &T) -> SerResult {
        self.element_with_ns(name, xmlns, |s| val.serialize_content(s))
    }

    /// Serializes a flattened `list`
    ///
    /// # Errors
@@ -174,6 +184,12 @@ fn start(name: &str) -> Event<'_> {
    Event::Start(BytesStart::new(name))
}

fn start_with_ns<'a>(name: &'a str, xmlns: &'a str) -> Event<'a> {
    let mut e = BytesStart::new(name);
    e.push_attribute(("xmlns", xmlns));
    Event::Start(e)
}

/// end event
fn end(name: &str) -> Event<'_> {
    Event::End(BytesEnd::new(name))
Loading