Server Test

Server Test

rev. f43b21ffbce44bc96d4cc50ec2cdc1eb04874c46

Files changed:

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras/rust-server-codegen/src/input.rs

@@ -1,1 +150,166 @@
    1      1   
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
    2      2   
#[allow(missing_docs)] // documentation missing in model
    3      3   
#[derive(::std::fmt::Debug)]
    4      4   
pub struct StreamingOperationWithOptionalDataInput {
    5      5   
    #[allow(missing_docs)] // documentation missing in model
    6      6   
    pub optional_data: ::std::option::Option<::std::string::String>,
    7      7   
    #[allow(missing_docs)] // documentation missing in model
    8      8   
    pub events: ::aws_smithy_http::event_stream::Receiver<
    9         -
        crate::model::Events,
   10         -
        ::aws_smithy_http::event_stream::MessageStreamError,
           9  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
          10  +
        crate::sigv4_event_stream::SignedEventError<
          11  +
            ::aws_smithy_http::event_stream::MessageStreamError,
          12  +
        >,
   11     13   
    >,
   12     14   
}
   13     15   
impl StreamingOperationWithOptionalDataInput {
   14     16   
    #[allow(missing_docs)] // documentation missing in model
   15     17   
    pub fn optional_data(&self) -> ::std::option::Option<&str> {
   16     18   
        self.optional_data.as_deref()
   17     19   
    }
   18     20   
    #[allow(missing_docs)] // documentation missing in model
   19     21   
    pub fn events(
   20     22   
        &self,
   21     23   
    ) -> &::aws_smithy_http::event_stream::Receiver<
   22         -
        crate::model::Events,
   23         -
        ::aws_smithy_http::event_stream::MessageStreamError,
          24  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
          25  +
        crate::sigv4_event_stream::SignedEventError<
          26  +
            ::aws_smithy_http::event_stream::MessageStreamError,
          27  +
        >,
   24     28   
    > {
   25     29   
        &self.events
   26     30   
    }
   27     31   
}
   28     32   
impl StreamingOperationWithOptionalDataInput {
   29     33   
    /// Creates a new builder-style object to manufacture [`StreamingOperationWithOptionalDataInput`](crate::input::StreamingOperationWithOptionalDataInput).
   30     34   
    pub fn builder() -> crate::input::streaming_operation_with_optional_data_input::Builder {
   31     35   
        crate::input::streaming_operation_with_optional_data_input::Builder::default()
   32     36   
    }
   33     37   
}
   34     38   
impl crate::constrained::Constrained for crate::input::StreamingOperationWithOptionalDataInput {
   35     39   
    type Unconstrained = crate::input::streaming_operation_with_optional_data_input::Builder;
   36     40   
}
   37     41   
   38     42   
#[allow(missing_docs)] // documentation missing in model
   39     43   
#[derive(::std::fmt::Debug)]
   40     44   
pub struct StreamingOperationWithInitialResponseInput {
   41     45   
    #[allow(missing_docs)] // documentation missing in model
   42     46   
    pub events: ::aws_smithy_http::event_stream::Receiver<
   43         -
        crate::model::Events,
   44         -
        ::aws_smithy_http::event_stream::MessageStreamError,
          47  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
          48  +
        crate::sigv4_event_stream::SignedEventError<
          49  +
            ::aws_smithy_http::event_stream::MessageStreamError,
          50  +
        >,
   45     51   
    >,
   46     52   
}
   47     53   
impl StreamingOperationWithInitialResponseInput {
   48     54   
    #[allow(missing_docs)] // documentation missing in model
   49     55   
    pub fn events(
   50     56   
        &self,
   51     57   
    ) -> &::aws_smithy_http::event_stream::Receiver<
   52         -
        crate::model::Events,
   53         -
        ::aws_smithy_http::event_stream::MessageStreamError,
          58  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
          59  +
        crate::sigv4_event_stream::SignedEventError<
          60  +
            ::aws_smithy_http::event_stream::MessageStreamError,
          61  +
        >,
   54     62   
    > {
   55     63   
        &self.events
   56     64   
    }
   57     65   
}
   58     66   
impl StreamingOperationWithInitialResponseInput {
   59     67   
    /// Creates a new builder-style object to manufacture [`StreamingOperationWithInitialResponseInput`](crate::input::StreamingOperationWithInitialResponseInput).
   60     68   
    pub fn builder() -> crate::input::streaming_operation_with_initial_response_input::Builder {
   61     69   
        crate::input::streaming_operation_with_initial_response_input::Builder::default()
   62     70   
    }
   63     71   
}
   64     72   
impl crate::constrained::Constrained for crate::input::StreamingOperationWithInitialResponseInput {
   65     73   
    type Unconstrained = crate::input::streaming_operation_with_initial_response_input::Builder;
   66     74   
}
   67     75   
   68     76   
#[allow(missing_docs)] // documentation missing in model
   69     77   
#[derive(::std::fmt::Debug)]
   70     78   
pub struct StreamingOperationWithInitialDataInput {
   71     79   
    #[allow(missing_docs)] // documentation missing in model
   72     80   
    pub initial_data: ::std::string::String,
   73     81   
    #[allow(missing_docs)] // documentation missing in model
   74     82   
    pub events: ::aws_smithy_http::event_stream::Receiver<
   75         -
        crate::model::Events,
   76         -
        ::aws_smithy_http::event_stream::MessageStreamError,
          83  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
          84  +
        crate::sigv4_event_stream::SignedEventError<
          85  +
            ::aws_smithy_http::event_stream::MessageStreamError,
          86  +
        >,
   77     87   
    >,
   78     88   
}
   79     89   
impl StreamingOperationWithInitialDataInput {
   80     90   
    #[allow(missing_docs)] // documentation missing in model
   81     91   
    pub fn initial_data(&self) -> &str {
   82     92   
        use std::ops::Deref;
   83     93   
        self.initial_data.deref()
   84     94   
    }
   85     95   
    #[allow(missing_docs)] // documentation missing in model
   86     96   
    pub fn events(
   87     97   
        &self,
   88     98   
    ) -> &::aws_smithy_http::event_stream::Receiver<
   89         -
        crate::model::Events,
   90         -
        ::aws_smithy_http::event_stream::MessageStreamError,
          99  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         100  +
        crate::sigv4_event_stream::SignedEventError<
         101  +
            ::aws_smithy_http::event_stream::MessageStreamError,
         102  +
        >,
   91    103   
    > {
   92    104   
        &self.events
   93    105   
    }
   94    106   
}
   95    107   
impl StreamingOperationWithInitialDataInput {
   96    108   
    /// Creates a new builder-style object to manufacture [`StreamingOperationWithInitialDataInput`](crate::input::StreamingOperationWithInitialDataInput).
   97    109   
    pub fn builder() -> crate::input::streaming_operation_with_initial_data_input::Builder {
   98    110   
        crate::input::streaming_operation_with_initial_data_input::Builder::default()
   99    111   
    }
  100    112   
}
  101    113   
impl crate::constrained::Constrained for crate::input::StreamingOperationWithInitialDataInput {
  102    114   
    type Unconstrained = crate::input::streaming_operation_with_initial_data_input::Builder;
  103    115   
}
  104    116   
  105    117   
#[allow(missing_docs)] // documentation missing in model
  106    118   
#[derive(::std::fmt::Debug)]
  107    119   
pub struct StreamingOperationInput {
  108    120   
    #[allow(missing_docs)] // documentation missing in model
  109    121   
    pub events: ::aws_smithy_http::event_stream::Receiver<
  110         -
        crate::model::Events,
  111         -
        ::aws_smithy_http::event_stream::MessageStreamError,
         122  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         123  +
        crate::sigv4_event_stream::SignedEventError<
         124  +
            ::aws_smithy_http::event_stream::MessageStreamError,
         125  +
        >,
  112    126   
    >,
  113    127   
}
  114    128   
impl StreamingOperationInput {
  115    129   
    #[allow(missing_docs)] // documentation missing in model
  116    130   
    pub fn events(
  117    131   
        &self,
  118    132   
    ) -> &::aws_smithy_http::event_stream::Receiver<
  119         -
        crate::model::Events,
  120         -
        ::aws_smithy_http::event_stream::MessageStreamError,
         133  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         134  +
        crate::sigv4_event_stream::SignedEventError<
         135  +
            ::aws_smithy_http::event_stream::MessageStreamError,
         136  +
        >,
  121    137   
    > {
  122    138   
        &self.events
  123    139   
    }
  124    140   
}
  125    141   
impl StreamingOperationInput {
  126    142   
    /// Creates a new builder-style object to manufacture [`StreamingOperationInput`](crate::input::StreamingOperationInput).
  127    143   
    pub fn builder() -> crate::input::streaming_operation_input::Builder {
  128    144   
        crate::input::streaming_operation_input::Builder::default()
  129    145   
    }
  130    146   
}
@@ -626,642 +725,747 @@
  646    662   
        fn try_from(builder: Builder) -> ::std::result::Result<Self, Self::Error> {
  647    663   
            builder.build()
  648    664   
        }
  649    665   
    }
  650    666   
    /// A builder for [`StreamingOperationWithOptionalDataInput`](crate::input::StreamingOperationWithOptionalDataInput).
  651    667   
    #[derive(::std::default::Default, ::std::fmt::Debug)]
  652    668   
    pub struct Builder {
  653    669   
        pub(crate) optional_data: ::std::option::Option<::std::string::String>,
  654    670   
        pub(crate) events: ::std::option::Option<
  655    671   
            ::aws_smithy_http::event_stream::Receiver<
  656         -
                crate::model::Events,
  657         -
                ::aws_smithy_http::event_stream::MessageStreamError,
         672  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         673  +
                crate::sigv4_event_stream::SignedEventError<
         674  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
         675  +
                >,
  658    676   
            >,
  659    677   
        >,
  660    678   
    }
  661    679   
    impl Builder {
  662    680   
        #[allow(missing_docs)] // documentation missing in model
  663    681   
        pub fn optional_data(
  664    682   
            mut self,
  665    683   
            input: ::std::option::Option<::std::string::String>,
  666    684   
        ) -> Self {
  667    685   
            self.optional_data = input;
  668    686   
            self
  669    687   
        }
  670    688   
        #[allow(missing_docs)] // documentation missing in model
  671    689   
        pub(crate) fn set_optional_data(
  672    690   
            mut self,
  673    691   
            input: Option<impl ::std::convert::Into<::std::string::String>>,
  674    692   
        ) -> Self {
  675    693   
            self.optional_data = input.map(|v| v.into());
  676    694   
            self
  677    695   
        }
  678    696   
        #[allow(missing_docs)] // documentation missing in model
  679    697   
        pub fn events(
  680    698   
            mut self,
  681    699   
            input: ::aws_smithy_http::event_stream::Receiver<
  682         -
                crate::model::Events,
  683         -
                ::aws_smithy_http::event_stream::MessageStreamError,
         700  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         701  +
                crate::sigv4_event_stream::SignedEventError<
         702  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
         703  +
                >,
  684    704   
            >,
  685    705   
        ) -> Self {
  686    706   
            self.events = Some(input);
  687    707   
            self
  688    708   
        }
  689    709   
        #[allow(missing_docs)] // documentation missing in model
  690    710   
        pub(crate) fn set_events(
  691    711   
            mut self,
  692    712   
            input: impl ::std::convert::Into<
  693    713   
                ::aws_smithy_http::event_stream::Receiver<
  694         -
                    crate::model::Events,
  695         -
                    ::aws_smithy_http::event_stream::MessageStreamError,
         714  +
                    crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         715  +
                    crate::sigv4_event_stream::SignedEventError<
         716  +
                        ::aws_smithy_http::event_stream::MessageStreamError,
         717  +
                    >,
  696    718   
                >,
  697    719   
            >,
  698    720   
        ) -> Self {
  699    721   
            self.events = Some(input.into());
  700    722   
            self
  701    723   
        }
  702    724   
        /// Consumes the builder and constructs a [`StreamingOperationWithOptionalDataInput`](crate::input::StreamingOperationWithOptionalDataInput).
  703    725   
        ///
  704    726   
        /// The builder fails to construct a [`StreamingOperationWithOptionalDataInput`](crate::input::StreamingOperationWithOptionalDataInput) if a [`ConstraintViolation`] occurs.
  705    727   
        ///
@@ -765,787 +848,876 @@
  785    807   
  786    808   
        fn try_from(builder: Builder) -> ::std::result::Result<Self, Self::Error> {
  787    809   
            builder.build()
  788    810   
        }
  789    811   
    }
  790    812   
    /// A builder for [`StreamingOperationWithInitialResponseInput`](crate::input::StreamingOperationWithInitialResponseInput).
  791    813   
    #[derive(::std::default::Default, ::std::fmt::Debug)]
  792    814   
    pub struct Builder {
  793    815   
        pub(crate) events: ::std::option::Option<
  794    816   
            ::aws_smithy_http::event_stream::Receiver<
  795         -
                crate::model::Events,
  796         -
                ::aws_smithy_http::event_stream::MessageStreamError,
         817  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         818  +
                crate::sigv4_event_stream::SignedEventError<
         819  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
         820  +
                >,
  797    821   
            >,
  798    822   
        >,
  799    823   
    }
  800    824   
    impl Builder {
  801    825   
        #[allow(missing_docs)] // documentation missing in model
  802    826   
        pub fn events(
  803    827   
            mut self,
  804    828   
            input: ::aws_smithy_http::event_stream::Receiver<
  805         -
                crate::model::Events,
  806         -
                ::aws_smithy_http::event_stream::MessageStreamError,
         829  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         830  +
                crate::sigv4_event_stream::SignedEventError<
         831  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
         832  +
                >,
  807    833   
            >,
  808    834   
        ) -> Self {
  809    835   
            self.events = Some(input);
  810    836   
            self
  811    837   
        }
  812    838   
        #[allow(missing_docs)] // documentation missing in model
  813    839   
        pub(crate) fn set_events(
  814    840   
            mut self,
  815    841   
            input: impl ::std::convert::Into<
  816    842   
                ::aws_smithy_http::event_stream::Receiver<
  817         -
                    crate::model::Events,
  818         -
                    ::aws_smithy_http::event_stream::MessageStreamError,
         843  +
                    crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         844  +
                    crate::sigv4_event_stream::SignedEventError<
         845  +
                        ::aws_smithy_http::event_stream::MessageStreamError,
         846  +
                    >,
  819    847   
                >,
  820    848   
            >,
  821    849   
        ) -> Self {
  822    850   
            self.events = Some(input.into());
  823    851   
            self
  824    852   
        }
  825    853   
        /// Consumes the builder and constructs a [`StreamingOperationWithInitialResponseInput`](crate::input::StreamingOperationWithInitialResponseInput).
  826    854   
        ///
  827    855   
        /// The builder fails to construct a [`StreamingOperationWithInitialResponseInput`](crate::input::StreamingOperationWithInitialResponseInput) if a [`ConstraintViolation`] occurs.
  828    856   
        ///
@@ -895,923 +991,1025 @@
  915    943   
        fn try_from(builder: Builder) -> ::std::result::Result<Self, Self::Error> {
  916    944   
            builder.build()
  917    945   
        }
  918    946   
    }
  919    947   
    /// A builder for [`StreamingOperationWithInitialDataInput`](crate::input::StreamingOperationWithInitialDataInput).
  920    948   
    #[derive(::std::default::Default, ::std::fmt::Debug)]
  921    949   
    pub struct Builder {
  922    950   
        pub(crate) initial_data: ::std::option::Option<::std::string::String>,
  923    951   
        pub(crate) events: ::std::option::Option<
  924    952   
            ::aws_smithy_http::event_stream::Receiver<
  925         -
                crate::model::Events,
  926         -
                ::aws_smithy_http::event_stream::MessageStreamError,
         953  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         954  +
                crate::sigv4_event_stream::SignedEventError<
         955  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
         956  +
                >,
  927    957   
            >,
  928    958   
        >,
  929    959   
    }
  930    960   
    impl Builder {
  931    961   
        #[allow(missing_docs)] // documentation missing in model
  932    962   
        pub fn initial_data(mut self, input: ::std::string::String) -> Self {
  933    963   
            self.initial_data = Some(input);
  934    964   
            self
  935    965   
        }
  936    966   
        #[allow(missing_docs)] // documentation missing in model
  937    967   
        pub(crate) fn set_initial_data(
  938    968   
            mut self,
  939    969   
            input: impl ::std::convert::Into<::std::string::String>,
  940    970   
        ) -> Self {
  941    971   
            self.initial_data = Some(input.into());
  942    972   
            self
  943    973   
        }
  944    974   
        #[allow(missing_docs)] // documentation missing in model
  945    975   
        pub fn events(
  946    976   
            mut self,
  947    977   
            input: ::aws_smithy_http::event_stream::Receiver<
  948         -
                crate::model::Events,
  949         -
                ::aws_smithy_http::event_stream::MessageStreamError,
         978  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         979  +
                crate::sigv4_event_stream::SignedEventError<
         980  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
         981  +
                >,
  950    982   
            >,
  951    983   
        ) -> Self {
  952    984   
            self.events = Some(input);
  953    985   
            self
  954    986   
        }
  955    987   
        #[allow(missing_docs)] // documentation missing in model
  956    988   
        pub(crate) fn set_events(
  957    989   
            mut self,
  958    990   
            input: impl ::std::convert::Into<
  959    991   
                ::aws_smithy_http::event_stream::Receiver<
  960         -
                    crate::model::Events,
  961         -
                    ::aws_smithy_http::event_stream::MessageStreamError,
         992  +
                    crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         993  +
                    crate::sigv4_event_stream::SignedEventError<
         994  +
                        ::aws_smithy_http::event_stream::MessageStreamError,
         995  +
                    >,
  962    996   
                >,
  963    997   
            >,
  964    998   
        ) -> Self {
  965    999   
            self.events = Some(input.into());
  966   1000   
            self
  967   1001   
        }
  968   1002   
        /// Consumes the builder and constructs a [`StreamingOperationWithInitialDataInput`](crate::input::StreamingOperationWithInitialDataInput).
  969   1003   
        ///
  970   1004   
        /// The builder fails to construct a [`StreamingOperationWithInitialDataInput`](crate::input::StreamingOperationWithInitialDataInput) if a [`ConstraintViolation`] occurs.
  971   1005   
        ///
@@ -1032,1066 +1115,1155 @@
 1052   1086   
 1053   1087   
        fn try_from(builder: Builder) -> ::std::result::Result<Self, Self::Error> {
 1054   1088   
            builder.build()
 1055   1089   
        }
 1056   1090   
    }
 1057   1091   
    /// A builder for [`StreamingOperationInput`](crate::input::StreamingOperationInput).
 1058   1092   
    #[derive(::std::default::Default, ::std::fmt::Debug)]
 1059   1093   
    pub struct Builder {
 1060   1094   
        pub(crate) events: ::std::option::Option<
 1061   1095   
            ::aws_smithy_http::event_stream::Receiver<
 1062         -
                crate::model::Events,
 1063         -
                ::aws_smithy_http::event_stream::MessageStreamError,
        1096  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
        1097  +
                crate::sigv4_event_stream::SignedEventError<
        1098  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
        1099  +
                >,
 1064   1100   
            >,
 1065   1101   
        >,
 1066   1102   
    }
 1067   1103   
    impl Builder {
 1068   1104   
        #[allow(missing_docs)] // documentation missing in model
 1069   1105   
        pub fn events(
 1070   1106   
            mut self,
 1071   1107   
            input: ::aws_smithy_http::event_stream::Receiver<
 1072         -
                crate::model::Events,
 1073         -
                ::aws_smithy_http::event_stream::MessageStreamError,
        1108  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
        1109  +
                crate::sigv4_event_stream::SignedEventError<
        1110  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
        1111  +
                >,
 1074   1112   
            >,
 1075   1113   
        ) -> Self {
 1076   1114   
            self.events = Some(input);
 1077   1115   
            self
 1078   1116   
        }
 1079   1117   
        #[allow(missing_docs)] // documentation missing in model
 1080   1118   
        pub(crate) fn set_events(
 1081   1119   
            mut self,
 1082   1120   
            input: impl ::std::convert::Into<
 1083   1121   
                ::aws_smithy_http::event_stream::Receiver<
 1084         -
                    crate::model::Events,
 1085         -
                    ::aws_smithy_http::event_stream::MessageStreamError,
        1122  +
                    crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
        1123  +
                    crate::sigv4_event_stream::SignedEventError<
        1124  +
                        ::aws_smithy_http::event_stream::MessageStreamError,
        1125  +
                    >,
 1086   1126   
                >,
 1087   1127   
            >,
 1088   1128   
        ) -> Self {
 1089   1129   
            self.events = Some(input.into());
 1090   1130   
            self
 1091   1131   
        }
 1092   1132   
        /// Consumes the builder and constructs a [`StreamingOperationInput`](crate::input::StreamingOperationInput).
 1093   1133   
        ///
 1094   1134   
        /// The builder fails to construct a [`StreamingOperationInput`](crate::input::StreamingOperationInput) if a [`ConstraintViolation`] occurs.
 1095   1135   
        ///

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras/rust-server-codegen/src/lib.rs

@@ -264,264 +296,298 @@
  284    284   
mod service;
  285    285   
  286    286   
/// Data primitives referenced by other data types.
  287    287   
pub mod types;
  288    288   
  289    289   
/// Unconstrained types for constrained shapes.
  290    290   
mod unconstrained;
  291    291   
  292    292   
mod mimes;
  293    293   
         294  +
mod sigv4_event_stream;
         295  +
  294    296   
mod event_stream_serde;
  295    297   
  296    298   
pub(crate) mod protocol_serde;

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras/rust-server-codegen/src/protocol_serde/shape_streaming_operation_input.rs

@@ -1,1 +17,20 @@
    1      1   
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
    2      2   
pub fn de_events_payload(
    3      3   
    body: &mut ::aws_smithy_types::body::SdkBody,
    4      4   
) -> std::result::Result<
    5      5   
    ::aws_smithy_http::event_stream::Receiver<
    6         -
        crate::model::Events,
    7         -
        ::aws_smithy_http::event_stream::MessageStreamError,
           6  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
           7  +
        crate::sigv4_event_stream::SignedEventError<
           8  +
            ::aws_smithy_http::event_stream::MessageStreamError,
           9  +
        >,
    8     10   
    >,
    9     11   
    ::aws_smithy_cbor::decode::DeserializeError,
   10     12   
> {
   11     13   
    let unmarshaller = crate::event_stream_serde::EventsUnmarshaller::new();
          14  +
    let unmarshaller = crate::sigv4_event_stream::SigV4Unmarshaller::new(unmarshaller);
   12     15   
    let body = std::mem::replace(body, ::aws_smithy_types::body::SdkBody::taken());
   13     16   
    Ok(::aws_smithy_http::event_stream::Receiver::new(
   14     17   
        unmarshaller,
   15     18   
        body,
   16     19   
    ))
   17     20   
}

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras/rust-server-codegen/src/protocol_serde/shape_streaming_operation_with_initial_data_input.rs

@@ -1,1 +17,20 @@
    1      1   
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
    2      2   
pub fn de_events_payload(
    3      3   
    body: &mut ::aws_smithy_types::body::SdkBody,
    4      4   
) -> std::result::Result<
    5      5   
    ::aws_smithy_http::event_stream::Receiver<
    6         -
        crate::model::Events,
    7         -
        ::aws_smithy_http::event_stream::MessageStreamError,
           6  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
           7  +
        crate::sigv4_event_stream::SignedEventError<
           8  +
            ::aws_smithy_http::event_stream::MessageStreamError,
           9  +
        >,
    8     10   
    >,
    9     11   
    ::aws_smithy_cbor::decode::DeserializeError,
   10     12   
> {
   11     13   
    let unmarshaller = crate::event_stream_serde::EventsUnmarshaller::new();
          14  +
    let unmarshaller = crate::sigv4_event_stream::SigV4Unmarshaller::new(unmarshaller);
   12     15   
    let body = std::mem::replace(body, ::aws_smithy_types::body::SdkBody::taken());
   13     16   
    Ok(::aws_smithy_http::event_stream::Receiver::new(
   14     17   
        unmarshaller,
   15     18   
        body,
   16     19   
    ))
   17     20   
}

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras/rust-server-codegen/src/protocol_serde/shape_streaming_operation_with_initial_response_input.rs

@@ -1,1 +17,20 @@
    1      1   
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
    2      2   
pub fn de_events_payload(
    3      3   
    body: &mut ::aws_smithy_types::body::SdkBody,
    4      4   
) -> std::result::Result<
    5      5   
    ::aws_smithy_http::event_stream::Receiver<
    6         -
        crate::model::Events,
    7         -
        ::aws_smithy_http::event_stream::MessageStreamError,
           6  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
           7  +
        crate::sigv4_event_stream::SignedEventError<
           8  +
            ::aws_smithy_http::event_stream::MessageStreamError,
           9  +
        >,
    8     10   
    >,
    9     11   
    ::aws_smithy_cbor::decode::DeserializeError,
   10     12   
> {
   11     13   
    let unmarshaller = crate::event_stream_serde::EventsUnmarshaller::new();
          14  +
    let unmarshaller = crate::sigv4_event_stream::SigV4Unmarshaller::new(unmarshaller);
   12     15   
    let body = std::mem::replace(body, ::aws_smithy_types::body::SdkBody::taken());
   13     16   
    Ok(::aws_smithy_http::event_stream::Receiver::new(
   14     17   
        unmarshaller,
   15     18   
        body,
   16     19   
    ))
   17     20   
}

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras/rust-server-codegen/src/protocol_serde/shape_streaming_operation_with_optional_data_input.rs

@@ -1,1 +17,20 @@
    1      1   
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
    2      2   
pub fn de_events_payload(
    3      3   
    body: &mut ::aws_smithy_types::body::SdkBody,
    4      4   
) -> std::result::Result<
    5      5   
    ::aws_smithy_http::event_stream::Receiver<
    6         -
        crate::model::Events,
    7         -
        ::aws_smithy_http::event_stream::MessageStreamError,
           6  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
           7  +
        crate::sigv4_event_stream::SignedEventError<
           8  +
            ::aws_smithy_http::event_stream::MessageStreamError,
           9  +
        >,
    8     10   
    >,
    9     11   
    ::aws_smithy_cbor::decode::DeserializeError,
   10     12   
> {
   11     13   
    let unmarshaller = crate::event_stream_serde::EventsUnmarshaller::new();
          14  +
    let unmarshaller = crate::sigv4_event_stream::SigV4Unmarshaller::new(unmarshaller);
   12     15   
    let body = std::mem::replace(body, ::aws_smithy_types::body::SdkBody::taken());
   13     16   
    Ok(::aws_smithy_http::event_stream::Receiver::new(
   14     17   
        unmarshaller,
   15     18   
        body,
   16     19   
    ))
   17     20   
}

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras/rust-server-codegen/src/sigv4_event_stream.rs

@@ -0,1 +0,195 @@
           1  +
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
           2  +
/// Wrapper for event stream messages that may be signed
           3  +
#[derive(Debug)]
           4  +
pub struct SignedEvent<T> {
           5  +
    /// The actual event message
           6  +
    pub message: T,
           7  +
    /// Signature information if the message was signed
           8  +
    pub signature: ::std::option::Option<crate::sigv4_event_stream::SignatureInfo>,
           9  +
}
          10  +
          11  +
/// Error wrapper for signed event stream errors
          12  +
#[derive(Debug)]
          13  +
pub enum SignedEventError<E> {
          14  +
    /// Error from the underlying event stream
          15  +
    Event(E),
          16  +
    /// Error extracting signed message
          17  +
    InvalidSignedEvent(crate::sigv4_event_stream::ExtractionError),
          18  +
}
          19  +
          20  +
impl<E> From<E> for SignedEventError<E> {
          21  +
    fn from(err: E) -> Self {
          22  +
        SignedEventError::Event(err)
          23  +
    }
          24  +
}
          25  +
          26  +
/// Information extracted from a signed event stream message
          27  +
#[non_exhaustive]
          28  +
#[derive(Debug, Clone)]
          29  +
pub struct SignatureInfo {
          30  +
    /// The chunk signature bytes from the `:chunk-signature` header
          31  +
    pub chunk_signature: Vec<u8>,
          32  +
    /// The timestamp from the `:date` header
          33  +
    pub timestamp: ::std::time::SystemTime,
          34  +
}
          35  +
          36  +
/// Error type for signed message extraction operations
          37  +
#[non_exhaustive]
          38  +
#[derive(Debug)]
          39  +
pub enum ExtractionError {
          40  +
    /// The payload could not be decoded as a valid message
          41  +
    #[non_exhaustive]
          42  +
    InvalidPayload {
          43  +
        error: ::aws_smithy_eventstream::error::Error,
          44  +
    },
          45  +
    /// The timestamp header is missing or has an invalid format
          46  +
    #[non_exhaustive]
          47  +
    InvalidTimestamp,
          48  +
}
          49  +
          50  +
/// Unmarshaller wrapper that handles SigV4 signed event stream messages
          51  +
#[derive(Debug)]
          52  +
pub struct SigV4Unmarshaller<T> {
          53  +
    inner: T,
          54  +
}
          55  +
          56  +
impl<T> SigV4Unmarshaller<T> {
          57  +
    pub fn new(inner: T) -> Self {
          58  +
        Self { inner }
          59  +
    }
          60  +
}
          61  +
          62  +
impl<T> ::aws_smithy_eventstream::frame::UnmarshallMessage for SigV4Unmarshaller<T>
          63  +
where
          64  +
    T: ::aws_smithy_eventstream::frame::UnmarshallMessage,
          65  +
{
          66  +
    type Output = crate::sigv4_event_stream::SignedEvent<T::Output>;
          67  +
    type Error = crate::sigv4_event_stream::SignedEventError<T::Error>;
          68  +
          69  +
    fn unmarshall(
          70  +
        &self,
          71  +
        message: &::aws_smithy_types::event_stream::Message,
          72  +
    ) -> ::std::result::Result<
          73  +
        ::aws_smithy_eventstream::frame::UnmarshalledMessage<Self::Output, Self::Error>,
          74  +
        ::aws_smithy_eventstream::error::Error,
          75  +
    > {
          76  +
        // First, try to extract the signed message
          77  +
        match crate::sigv4_event_stream::extract_signed_message(message) {
          78  +
            Ok(MaybeSignedMessage::Signed {
          79  +
                message: inner_message,
          80  +
                signature,
          81  +
            }) => {
          82  +
                // Process the inner message with the base unmarshaller
          83  +
                match self.inner.unmarshall(&inner_message) {
          84  +
                    Ok(unmarshalled) => match unmarshalled {
          85  +
                        ::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(event) => {
          86  +
                            Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(
          87  +
                                crate::sigv4_event_stream::SignedEvent {
          88  +
                                    message: event,
          89  +
                                    signature: Some(signature),
          90  +
                                },
          91  +
                            ))
          92  +
                        }
          93  +
                        ::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(err) => {
          94  +
                            Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
          95  +
                                crate::sigv4_event_stream::SignedEventError::Event(err),
          96  +
                            ))
          97  +
                        }
          98  +
                    },
          99  +
                    Err(err) => Err(err),
         100  +
                }
         101  +
            }
         102  +
            Ok(MaybeSignedMessage::Unsigned) => {
         103  +
                // Process unsigned message directly
         104  +
                match self.inner.unmarshall(message) {
         105  +
                    Ok(unmarshalled) => match unmarshalled {
         106  +
                        ::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(event) => {
         107  +
                            Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(
         108  +
                                crate::sigv4_event_stream::SignedEvent {
         109  +
                                    message: event,
         110  +
                                    signature: None,
         111  +
                                },
         112  +
                            ))
         113  +
                        }
         114  +
                        ::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(err) => {
         115  +
                            Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
         116  +
                                crate::sigv4_event_stream::SignedEventError::Event(err),
         117  +
                            ))
         118  +
                        }
         119  +
                    },
         120  +
                    Err(err) => Err(err),
         121  +
                }
         122  +
            }
         123  +
            Err(extraction_err) => Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
         124  +
                crate::sigv4_event_stream::SignedEventError::InvalidSignedEvent(extraction_err),
         125  +
            )),
         126  +
        }
         127  +
    }
         128  +
}
         129  +
         130  +
/// Result of extracting a potentially signed message
         131  +
#[derive(Debug)]
         132  +
pub enum MaybeSignedMessage {
         133  +
    /// Message was signed and has been extracted
         134  +
    Signed {
         135  +
        /// The inner message that was signed
         136  +
        message: ::aws_smithy_types::event_stream::Message,
         137  +
        /// Signature information from the outer message
         138  +
        signature: crate::sigv4_event_stream::SignatureInfo,
         139  +
    },
         140  +
    /// Message was not signed (no `:chunk-signature` header present)
         141  +
    Unsigned,
         142  +
}
         143  +
         144  +
/// Extracts the inner message from a potentially signed event stream message.
         145  +
pub fn extract_signed_message(
         146  +
    message: &::aws_smithy_types::event_stream::Message,
         147  +
) -> ::std::result::Result<MaybeSignedMessage, crate::sigv4_event_stream::ExtractionError> {
         148  +
    // Check if message has chunk signature
         149  +
    let mut chunk_signature = None;
         150  +
    let mut timestamp = None;
         151  +
         152  +
    for header in message.headers() {
         153  +
        match header.name().as_str() {
         154  +
            ":chunk-signature" => {
         155  +
                if let ::aws_smithy_types::event_stream::HeaderValue::ByteArray(bytes) =
         156  +
                    header.value()
         157  +
                {
         158  +
                    chunk_signature = Some(bytes.as_ref().to_vec());
         159  +
                }
         160  +
            }
         161  +
            ":date" => {
         162  +
                if let ::aws_smithy_types::event_stream::HeaderValue::Timestamp(ts) = header.value()
         163  +
                {
         164  +
                    timestamp = Some(::std::time::SystemTime::try_from(*ts).map_err(|_err| {
         165  +
                        crate::sigv4_event_stream::ExtractionError::InvalidTimestamp
         166  +
                    })?);
         167  +
                } else {
         168  +
                    return Err(crate::sigv4_event_stream::ExtractionError::InvalidTimestamp);
         169  +
                }
         170  +
            }
         171  +
            _ => {}
         172  +
        }
         173  +
    }
         174  +
         175  +
    let Some(chunk_signature) = chunk_signature else {
         176  +
        return Ok(MaybeSignedMessage::Unsigned);
         177  +
    };
         178  +
         179  +
    let Some(timestamp) = timestamp else {
         180  +
        return Err(crate::sigv4_event_stream::ExtractionError::InvalidTimestamp);
         181  +
    };
         182  +
         183  +
    // Extract inner message
         184  +
    let cursor = ::std::io::Cursor::new(message.payload());
         185  +
    let inner_message = ::aws_smithy_eventstream::frame::read_message_from(cursor)
         186  +
        .map_err(|err| crate::sigv4_event_stream::ExtractionError::InvalidPayload { error: err })?;
         187  +
         188  +
    Ok(MaybeSignedMessage::Signed {
         189  +
        message: inner_message,
         190  +
        signature: crate::sigv4_event_stream::SignatureInfo {
         191  +
            chunk_signature,
         192  +
            timestamp,
         193  +
        },
         194  +
    })
         195  +
}

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras_no_initial_response/rust-server-codegen/src/input.rs

@@ -1,1 +150,166 @@
    1      1   
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
    2      2   
#[allow(missing_docs)] // documentation missing in model
    3      3   
#[derive(::std::fmt::Debug)]
    4      4   
pub struct StreamingOperationWithOptionalDataInput {
    5      5   
    #[allow(missing_docs)] // documentation missing in model
    6      6   
    pub optional_data: ::std::option::Option<::std::string::String>,
    7      7   
    #[allow(missing_docs)] // documentation missing in model
    8      8   
    pub events: ::aws_smithy_http::event_stream::Receiver<
    9         -
        crate::model::Events,
   10         -
        ::aws_smithy_http::event_stream::MessageStreamError,
           9  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
          10  +
        crate::sigv4_event_stream::SignedEventError<
          11  +
            ::aws_smithy_http::event_stream::MessageStreamError,
          12  +
        >,
   11     13   
    >,
   12     14   
}
   13     15   
impl StreamingOperationWithOptionalDataInput {
   14     16   
    #[allow(missing_docs)] // documentation missing in model
   15     17   
    pub fn optional_data(&self) -> ::std::option::Option<&str> {
   16     18   
        self.optional_data.as_deref()
   17     19   
    }
   18     20   
    #[allow(missing_docs)] // documentation missing in model
   19     21   
    pub fn events(
   20     22   
        &self,
   21     23   
    ) -> &::aws_smithy_http::event_stream::Receiver<
   22         -
        crate::model::Events,
   23         -
        ::aws_smithy_http::event_stream::MessageStreamError,
          24  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
          25  +
        crate::sigv4_event_stream::SignedEventError<
          26  +
            ::aws_smithy_http::event_stream::MessageStreamError,
          27  +
        >,
   24     28   
    > {
   25     29   
        &self.events
   26     30   
    }
   27     31   
}
   28     32   
impl StreamingOperationWithOptionalDataInput {
   29     33   
    /// Creates a new builder-style object to manufacture [`StreamingOperationWithOptionalDataInput`](crate::input::StreamingOperationWithOptionalDataInput).
   30     34   
    pub fn builder() -> crate::input::streaming_operation_with_optional_data_input::Builder {
   31     35   
        crate::input::streaming_operation_with_optional_data_input::Builder::default()
   32     36   
    }
   33     37   
}
   34     38   
impl crate::constrained::Constrained for crate::input::StreamingOperationWithOptionalDataInput {
   35     39   
    type Unconstrained = crate::input::streaming_operation_with_optional_data_input::Builder;
   36     40   
}
   37     41   
   38     42   
#[allow(missing_docs)] // documentation missing in model
   39     43   
#[derive(::std::fmt::Debug)]
   40     44   
pub struct StreamingOperationWithInitialResponseInput {
   41     45   
    #[allow(missing_docs)] // documentation missing in model
   42     46   
    pub events: ::aws_smithy_http::event_stream::Receiver<
   43         -
        crate::model::Events,
   44         -
        ::aws_smithy_http::event_stream::MessageStreamError,
          47  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
          48  +
        crate::sigv4_event_stream::SignedEventError<
          49  +
            ::aws_smithy_http::event_stream::MessageStreamError,
          50  +
        >,
   45     51   
    >,
   46     52   
}
   47     53   
impl StreamingOperationWithInitialResponseInput {
   48     54   
    #[allow(missing_docs)] // documentation missing in model
   49     55   
    pub fn events(
   50     56   
        &self,
   51     57   
    ) -> &::aws_smithy_http::event_stream::Receiver<
   52         -
        crate::model::Events,
   53         -
        ::aws_smithy_http::event_stream::MessageStreamError,
          58  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
          59  +
        crate::sigv4_event_stream::SignedEventError<
          60  +
            ::aws_smithy_http::event_stream::MessageStreamError,
          61  +
        >,
   54     62   
    > {
   55     63   
        &self.events
   56     64   
    }
   57     65   
}
   58     66   
impl StreamingOperationWithInitialResponseInput {
   59     67   
    /// Creates a new builder-style object to manufacture [`StreamingOperationWithInitialResponseInput`](crate::input::StreamingOperationWithInitialResponseInput).
   60     68   
    pub fn builder() -> crate::input::streaming_operation_with_initial_response_input::Builder {
   61     69   
        crate::input::streaming_operation_with_initial_response_input::Builder::default()
   62     70   
    }
   63     71   
}
   64     72   
impl crate::constrained::Constrained for crate::input::StreamingOperationWithInitialResponseInput {
   65     73   
    type Unconstrained = crate::input::streaming_operation_with_initial_response_input::Builder;
   66     74   
}
   67     75   
   68     76   
#[allow(missing_docs)] // documentation missing in model
   69     77   
#[derive(::std::fmt::Debug)]
   70     78   
pub struct StreamingOperationWithInitialDataInput {
   71     79   
    #[allow(missing_docs)] // documentation missing in model
   72     80   
    pub initial_data: ::std::string::String,
   73     81   
    #[allow(missing_docs)] // documentation missing in model
   74     82   
    pub events: ::aws_smithy_http::event_stream::Receiver<
   75         -
        crate::model::Events,
   76         -
        ::aws_smithy_http::event_stream::MessageStreamError,
          83  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
          84  +
        crate::sigv4_event_stream::SignedEventError<
          85  +
            ::aws_smithy_http::event_stream::MessageStreamError,
          86  +
        >,
   77     87   
    >,
   78     88   
}
   79     89   
impl StreamingOperationWithInitialDataInput {
   80     90   
    #[allow(missing_docs)] // documentation missing in model
   81     91   
    pub fn initial_data(&self) -> &str {
   82     92   
        use std::ops::Deref;
   83     93   
        self.initial_data.deref()
   84     94   
    }
   85     95   
    #[allow(missing_docs)] // documentation missing in model
   86     96   
    pub fn events(
   87     97   
        &self,
   88     98   
    ) -> &::aws_smithy_http::event_stream::Receiver<
   89         -
        crate::model::Events,
   90         -
        ::aws_smithy_http::event_stream::MessageStreamError,
          99  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         100  +
        crate::sigv4_event_stream::SignedEventError<
         101  +
            ::aws_smithy_http::event_stream::MessageStreamError,
         102  +
        >,
   91    103   
    > {
   92    104   
        &self.events
   93    105   
    }
   94    106   
}
   95    107   
impl StreamingOperationWithInitialDataInput {
   96    108   
    /// Creates a new builder-style object to manufacture [`StreamingOperationWithInitialDataInput`](crate::input::StreamingOperationWithInitialDataInput).
   97    109   
    pub fn builder() -> crate::input::streaming_operation_with_initial_data_input::Builder {
   98    110   
        crate::input::streaming_operation_with_initial_data_input::Builder::default()
   99    111   
    }
  100    112   
}
  101    113   
impl crate::constrained::Constrained for crate::input::StreamingOperationWithInitialDataInput {
  102    114   
    type Unconstrained = crate::input::streaming_operation_with_initial_data_input::Builder;
  103    115   
}
  104    116   
  105    117   
#[allow(missing_docs)] // documentation missing in model
  106    118   
#[derive(::std::fmt::Debug)]
  107    119   
pub struct StreamingOperationInput {
  108    120   
    #[allow(missing_docs)] // documentation missing in model
  109    121   
    pub events: ::aws_smithy_http::event_stream::Receiver<
  110         -
        crate::model::Events,
  111         -
        ::aws_smithy_http::event_stream::MessageStreamError,
         122  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         123  +
        crate::sigv4_event_stream::SignedEventError<
         124  +
            ::aws_smithy_http::event_stream::MessageStreamError,
         125  +
        >,
  112    126   
    >,
  113    127   
}
  114    128   
impl StreamingOperationInput {
  115    129   
    #[allow(missing_docs)] // documentation missing in model
  116    130   
    pub fn events(
  117    131   
        &self,
  118    132   
    ) -> &::aws_smithy_http::event_stream::Receiver<
  119         -
        crate::model::Events,
  120         -
        ::aws_smithy_http::event_stream::MessageStreamError,
         133  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         134  +
        crate::sigv4_event_stream::SignedEventError<
         135  +
            ::aws_smithy_http::event_stream::MessageStreamError,
         136  +
        >,
  121    137   
    > {
  122    138   
        &self.events
  123    139   
    }
  124    140   
}
  125    141   
impl StreamingOperationInput {
  126    142   
    /// Creates a new builder-style object to manufacture [`StreamingOperationInput`](crate::input::StreamingOperationInput).
  127    143   
    pub fn builder() -> crate::input::streaming_operation_input::Builder {
  128    144   
        crate::input::streaming_operation_input::Builder::default()
  129    145   
    }
  130    146   
}
@@ -626,642 +725,747 @@
  646    662   
        fn try_from(builder: Builder) -> ::std::result::Result<Self, Self::Error> {
  647    663   
            builder.build()
  648    664   
        }
  649    665   
    }
  650    666   
    /// A builder for [`StreamingOperationWithOptionalDataInput`](crate::input::StreamingOperationWithOptionalDataInput).
  651    667   
    #[derive(::std::default::Default, ::std::fmt::Debug)]
  652    668   
    pub struct Builder {
  653    669   
        pub(crate) optional_data: ::std::option::Option<::std::string::String>,
  654    670   
        pub(crate) events: ::std::option::Option<
  655    671   
            ::aws_smithy_http::event_stream::Receiver<
  656         -
                crate::model::Events,
  657         -
                ::aws_smithy_http::event_stream::MessageStreamError,
         672  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         673  +
                crate::sigv4_event_stream::SignedEventError<
         674  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
         675  +
                >,
  658    676   
            >,
  659    677   
        >,
  660    678   
    }
  661    679   
    impl Builder {
  662    680   
        #[allow(missing_docs)] // documentation missing in model
  663    681   
        pub fn optional_data(
  664    682   
            mut self,
  665    683   
            input: ::std::option::Option<::std::string::String>,
  666    684   
        ) -> Self {
  667    685   
            self.optional_data = input;
  668    686   
            self
  669    687   
        }
  670    688   
        #[allow(missing_docs)] // documentation missing in model
  671    689   
        pub(crate) fn set_optional_data(
  672    690   
            mut self,
  673    691   
            input: Option<impl ::std::convert::Into<::std::string::String>>,
  674    692   
        ) -> Self {
  675    693   
            self.optional_data = input.map(|v| v.into());
  676    694   
            self
  677    695   
        }
  678    696   
        #[allow(missing_docs)] // documentation missing in model
  679    697   
        pub fn events(
  680    698   
            mut self,
  681    699   
            input: ::aws_smithy_http::event_stream::Receiver<
  682         -
                crate::model::Events,
  683         -
                ::aws_smithy_http::event_stream::MessageStreamError,
         700  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         701  +
                crate::sigv4_event_stream::SignedEventError<
         702  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
         703  +
                >,
  684    704   
            >,
  685    705   
        ) -> Self {
  686    706   
            self.events = Some(input);
  687    707   
            self
  688    708   
        }
  689    709   
        #[allow(missing_docs)] // documentation missing in model
  690    710   
        pub(crate) fn set_events(
  691    711   
            mut self,
  692    712   
            input: impl ::std::convert::Into<
  693    713   
                ::aws_smithy_http::event_stream::Receiver<
  694         -
                    crate::model::Events,
  695         -
                    ::aws_smithy_http::event_stream::MessageStreamError,
         714  +
                    crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         715  +
                    crate::sigv4_event_stream::SignedEventError<
         716  +
                        ::aws_smithy_http::event_stream::MessageStreamError,
         717  +
                    >,
  696    718   
                >,
  697    719   
            >,
  698    720   
        ) -> Self {
  699    721   
            self.events = Some(input.into());
  700    722   
            self
  701    723   
        }
  702    724   
        /// Consumes the builder and constructs a [`StreamingOperationWithOptionalDataInput`](crate::input::StreamingOperationWithOptionalDataInput).
  703    725   
        ///
  704    726   
        /// The builder fails to construct a [`StreamingOperationWithOptionalDataInput`](crate::input::StreamingOperationWithOptionalDataInput) if a [`ConstraintViolation`] occurs.
  705    727   
        ///
@@ -765,787 +848,876 @@
  785    807   
  786    808   
        fn try_from(builder: Builder) -> ::std::result::Result<Self, Self::Error> {
  787    809   
            builder.build()
  788    810   
        }
  789    811   
    }
  790    812   
    /// A builder for [`StreamingOperationWithInitialResponseInput`](crate::input::StreamingOperationWithInitialResponseInput).
  791    813   
    #[derive(::std::default::Default, ::std::fmt::Debug)]
  792    814   
    pub struct Builder {
  793    815   
        pub(crate) events: ::std::option::Option<
  794    816   
            ::aws_smithy_http::event_stream::Receiver<
  795         -
                crate::model::Events,
  796         -
                ::aws_smithy_http::event_stream::MessageStreamError,
         817  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         818  +
                crate::sigv4_event_stream::SignedEventError<
         819  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
         820  +
                >,
  797    821   
            >,
  798    822   
        >,
  799    823   
    }
  800    824   
    impl Builder {
  801    825   
        #[allow(missing_docs)] // documentation missing in model
  802    826   
        pub fn events(
  803    827   
            mut self,
  804    828   
            input: ::aws_smithy_http::event_stream::Receiver<
  805         -
                crate::model::Events,
  806         -
                ::aws_smithy_http::event_stream::MessageStreamError,
         829  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         830  +
                crate::sigv4_event_stream::SignedEventError<
         831  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
         832  +
                >,
  807    833   
            >,
  808    834   
        ) -> Self {
  809    835   
            self.events = Some(input);
  810    836   
            self
  811    837   
        }
  812    838   
        #[allow(missing_docs)] // documentation missing in model
  813    839   
        pub(crate) fn set_events(
  814    840   
            mut self,
  815    841   
            input: impl ::std::convert::Into<
  816    842   
                ::aws_smithy_http::event_stream::Receiver<
  817         -
                    crate::model::Events,
  818         -
                    ::aws_smithy_http::event_stream::MessageStreamError,
         843  +
                    crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         844  +
                    crate::sigv4_event_stream::SignedEventError<
         845  +
                        ::aws_smithy_http::event_stream::MessageStreamError,
         846  +
                    >,
  819    847   
                >,
  820    848   
            >,
  821    849   
        ) -> Self {
  822    850   
            self.events = Some(input.into());
  823    851   
            self
  824    852   
        }
  825    853   
        /// Consumes the builder and constructs a [`StreamingOperationWithInitialResponseInput`](crate::input::StreamingOperationWithInitialResponseInput).
  826    854   
        ///
  827    855   
        /// The builder fails to construct a [`StreamingOperationWithInitialResponseInput`](crate::input::StreamingOperationWithInitialResponseInput) if a [`ConstraintViolation`] occurs.
  828    856   
        ///
@@ -895,923 +991,1025 @@
  915    943   
        fn try_from(builder: Builder) -> ::std::result::Result<Self, Self::Error> {
  916    944   
            builder.build()
  917    945   
        }
  918    946   
    }
  919    947   
    /// A builder for [`StreamingOperationWithInitialDataInput`](crate::input::StreamingOperationWithInitialDataInput).
  920    948   
    #[derive(::std::default::Default, ::std::fmt::Debug)]
  921    949   
    pub struct Builder {
  922    950   
        pub(crate) initial_data: ::std::option::Option<::std::string::String>,
  923    951   
        pub(crate) events: ::std::option::Option<
  924    952   
            ::aws_smithy_http::event_stream::Receiver<
  925         -
                crate::model::Events,
  926         -
                ::aws_smithy_http::event_stream::MessageStreamError,
         953  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         954  +
                crate::sigv4_event_stream::SignedEventError<
         955  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
         956  +
                >,
  927    957   
            >,
  928    958   
        >,
  929    959   
    }
  930    960   
    impl Builder {
  931    961   
        #[allow(missing_docs)] // documentation missing in model
  932    962   
        pub fn initial_data(mut self, input: ::std::string::String) -> Self {
  933    963   
            self.initial_data = Some(input);
  934    964   
            self
  935    965   
        }
  936    966   
        #[allow(missing_docs)] // documentation missing in model
  937    967   
        pub(crate) fn set_initial_data(
  938    968   
            mut self,
  939    969   
            input: impl ::std::convert::Into<::std::string::String>,
  940    970   
        ) -> Self {
  941    971   
            self.initial_data = Some(input.into());
  942    972   
            self
  943    973   
        }
  944    974   
        #[allow(missing_docs)] // documentation missing in model
  945    975   
        pub fn events(
  946    976   
            mut self,
  947    977   
            input: ::aws_smithy_http::event_stream::Receiver<
  948         -
                crate::model::Events,
  949         -
                ::aws_smithy_http::event_stream::MessageStreamError,
         978  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         979  +
                crate::sigv4_event_stream::SignedEventError<
         980  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
         981  +
                >,
  950    982   
            >,
  951    983   
        ) -> Self {
  952    984   
            self.events = Some(input);
  953    985   
            self
  954    986   
        }
  955    987   
        #[allow(missing_docs)] // documentation missing in model
  956    988   
        pub(crate) fn set_events(
  957    989   
            mut self,
  958    990   
            input: impl ::std::convert::Into<
  959    991   
                ::aws_smithy_http::event_stream::Receiver<
  960         -
                    crate::model::Events,
  961         -
                    ::aws_smithy_http::event_stream::MessageStreamError,
         992  +
                    crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
         993  +
                    crate::sigv4_event_stream::SignedEventError<
         994  +
                        ::aws_smithy_http::event_stream::MessageStreamError,
         995  +
                    >,
  962    996   
                >,
  963    997   
            >,
  964    998   
        ) -> Self {
  965    999   
            self.events = Some(input.into());
  966   1000   
            self
  967   1001   
        }
  968   1002   
        /// Consumes the builder and constructs a [`StreamingOperationWithInitialDataInput`](crate::input::StreamingOperationWithInitialDataInput).
  969   1003   
        ///
  970   1004   
        /// The builder fails to construct a [`StreamingOperationWithInitialDataInput`](crate::input::StreamingOperationWithInitialDataInput) if a [`ConstraintViolation`] occurs.
  971   1005   
        ///
@@ -1032,1066 +1115,1155 @@
 1052   1086   
 1053   1087   
        fn try_from(builder: Builder) -> ::std::result::Result<Self, Self::Error> {
 1054   1088   
            builder.build()
 1055   1089   
        }
 1056   1090   
    }
 1057   1091   
    /// A builder for [`StreamingOperationInput`](crate::input::StreamingOperationInput).
 1058   1092   
    #[derive(::std::default::Default, ::std::fmt::Debug)]
 1059   1093   
    pub struct Builder {
 1060   1094   
        pub(crate) events: ::std::option::Option<
 1061   1095   
            ::aws_smithy_http::event_stream::Receiver<
 1062         -
                crate::model::Events,
 1063         -
                ::aws_smithy_http::event_stream::MessageStreamError,
        1096  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
        1097  +
                crate::sigv4_event_stream::SignedEventError<
        1098  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
        1099  +
                >,
 1064   1100   
            >,
 1065   1101   
        >,
 1066   1102   
    }
 1067   1103   
    impl Builder {
 1068   1104   
        #[allow(missing_docs)] // documentation missing in model
 1069   1105   
        pub fn events(
 1070   1106   
            mut self,
 1071   1107   
            input: ::aws_smithy_http::event_stream::Receiver<
 1072         -
                crate::model::Events,
 1073         -
                ::aws_smithy_http::event_stream::MessageStreamError,
        1108  +
                crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
        1109  +
                crate::sigv4_event_stream::SignedEventError<
        1110  +
                    ::aws_smithy_http::event_stream::MessageStreamError,
        1111  +
                >,
 1074   1112   
            >,
 1075   1113   
        ) -> Self {
 1076   1114   
            self.events = Some(input);
 1077   1115   
            self
 1078   1116   
        }
 1079   1117   
        #[allow(missing_docs)] // documentation missing in model
 1080   1118   
        pub(crate) fn set_events(
 1081   1119   
            mut self,
 1082   1120   
            input: impl ::std::convert::Into<
 1083   1121   
                ::aws_smithy_http::event_stream::Receiver<
 1084         -
                    crate::model::Events,
 1085         -
                    ::aws_smithy_http::event_stream::MessageStreamError,
        1122  +
                    crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
        1123  +
                    crate::sigv4_event_stream::SignedEventError<
        1124  +
                        ::aws_smithy_http::event_stream::MessageStreamError,
        1125  +
                    >,
 1086   1126   
                >,
 1087   1127   
            >,
 1088   1128   
        ) -> Self {
 1089   1129   
            self.events = Some(input.into());
 1090   1130   
            self
 1091   1131   
        }
 1092   1132   
        /// Consumes the builder and constructs a [`StreamingOperationInput`](crate::input::StreamingOperationInput).
 1093   1133   
        ///
 1094   1134   
        /// The builder fails to construct a [`StreamingOperationInput`](crate::input::StreamingOperationInput) if a [`ConstraintViolation`] occurs.
 1095   1135   
        ///

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras_no_initial_response/rust-server-codegen/src/lib.rs

@@ -264,264 +296,298 @@
  284    284   
mod service;
  285    285   
  286    286   
/// Data primitives referenced by other data types.
  287    287   
pub mod types;
  288    288   
  289    289   
/// Unconstrained types for constrained shapes.
  290    290   
mod unconstrained;
  291    291   
  292    292   
mod mimes;
  293    293   
         294  +
mod sigv4_event_stream;
         295  +
  294    296   
mod event_stream_serde;
  295    297   
  296    298   
pub(crate) mod protocol_serde;

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras_no_initial_response/rust-server-codegen/src/protocol_serde/shape_streaming_operation_input.rs

@@ -1,1 +17,20 @@
    1      1   
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
    2      2   
pub fn de_events_payload(
    3      3   
    body: &mut ::aws_smithy_types::body::SdkBody,
    4      4   
) -> std::result::Result<
    5      5   
    ::aws_smithy_http::event_stream::Receiver<
    6         -
        crate::model::Events,
    7         -
        ::aws_smithy_http::event_stream::MessageStreamError,
           6  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
           7  +
        crate::sigv4_event_stream::SignedEventError<
           8  +
            ::aws_smithy_http::event_stream::MessageStreamError,
           9  +
        >,
    8     10   
    >,
    9     11   
    ::aws_smithy_cbor::decode::DeserializeError,
   10     12   
> {
   11     13   
    let unmarshaller = crate::event_stream_serde::EventsUnmarshaller::new();
          14  +
    let unmarshaller = crate::sigv4_event_stream::SigV4Unmarshaller::new(unmarshaller);
   12     15   
    let body = std::mem::replace(body, ::aws_smithy_types::body::SdkBody::taken());
   13     16   
    Ok(::aws_smithy_http::event_stream::Receiver::new(
   14     17   
        unmarshaller,
   15     18   
        body,
   16     19   
    ))
   17     20   
}

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras_no_initial_response/rust-server-codegen/src/protocol_serde/shape_streaming_operation_with_initial_data_input.rs

@@ -1,1 +17,20 @@
    1      1   
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
    2      2   
pub fn de_events_payload(
    3      3   
    body: &mut ::aws_smithy_types::body::SdkBody,
    4      4   
) -> std::result::Result<
    5      5   
    ::aws_smithy_http::event_stream::Receiver<
    6         -
        crate::model::Events,
    7         -
        ::aws_smithy_http::event_stream::MessageStreamError,
           6  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
           7  +
        crate::sigv4_event_stream::SignedEventError<
           8  +
            ::aws_smithy_http::event_stream::MessageStreamError,
           9  +
        >,
    8     10   
    >,
    9     11   
    ::aws_smithy_cbor::decode::DeserializeError,
   10     12   
> {
   11     13   
    let unmarshaller = crate::event_stream_serde::EventsUnmarshaller::new();
          14  +
    let unmarshaller = crate::sigv4_event_stream::SigV4Unmarshaller::new(unmarshaller);
   12     15   
    let body = std::mem::replace(body, ::aws_smithy_types::body::SdkBody::taken());
   13     16   
    Ok(::aws_smithy_http::event_stream::Receiver::new(
   14     17   
        unmarshaller,
   15     18   
        body,
   16     19   
    ))
   17     20   
}

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras_no_initial_response/rust-server-codegen/src/protocol_serde/shape_streaming_operation_with_initial_response_input.rs

@@ -1,1 +17,20 @@
    1      1   
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
    2      2   
pub fn de_events_payload(
    3      3   
    body: &mut ::aws_smithy_types::body::SdkBody,
    4      4   
) -> std::result::Result<
    5      5   
    ::aws_smithy_http::event_stream::Receiver<
    6         -
        crate::model::Events,
    7         -
        ::aws_smithy_http::event_stream::MessageStreamError,
           6  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
           7  +
        crate::sigv4_event_stream::SignedEventError<
           8  +
            ::aws_smithy_http::event_stream::MessageStreamError,
           9  +
        >,
    8     10   
    >,
    9     11   
    ::aws_smithy_cbor::decode::DeserializeError,
   10     12   
> {
   11     13   
    let unmarshaller = crate::event_stream_serde::EventsUnmarshaller::new();
          14  +
    let unmarshaller = crate::sigv4_event_stream::SigV4Unmarshaller::new(unmarshaller);
   12     15   
    let body = std::mem::replace(body, ::aws_smithy_types::body::SdkBody::taken());
   13     16   
    Ok(::aws_smithy_http::event_stream::Receiver::new(
   14     17   
        unmarshaller,
   15     18   
        body,
   16     19   
    ))
   17     20   
}

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras_no_initial_response/rust-server-codegen/src/protocol_serde/shape_streaming_operation_with_optional_data_input.rs

@@ -1,1 +17,20 @@
    1      1   
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
    2      2   
pub fn de_events_payload(
    3      3   
    body: &mut ::aws_smithy_types::body::SdkBody,
    4      4   
) -> std::result::Result<
    5      5   
    ::aws_smithy_http::event_stream::Receiver<
    6         -
        crate::model::Events,
    7         -
        ::aws_smithy_http::event_stream::MessageStreamError,
           6  +
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
           7  +
        crate::sigv4_event_stream::SignedEventError<
           8  +
            ::aws_smithy_http::event_stream::MessageStreamError,
           9  +
        >,
    8     10   
    >,
    9     11   
    ::aws_smithy_cbor::decode::DeserializeError,
   10     12   
> {
   11     13   
    let unmarshaller = crate::event_stream_serde::EventsUnmarshaller::new();
          14  +
    let unmarshaller = crate::sigv4_event_stream::SigV4Unmarshaller::new(unmarshaller);
   12     15   
    let body = std::mem::replace(body, ::aws_smithy_types::body::SdkBody::taken());
   13     16   
    Ok(::aws_smithy_http::event_stream::Receiver::new(
   14     17   
        unmarshaller,
   15     18   
        body,
   16     19   
    ))
   17     20   
}

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras_no_initial_response/rust-server-codegen/src/sigv4_event_stream.rs

@@ -0,1 +0,195 @@
           1  +
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
           2  +
/// Wrapper for event stream messages that may be signed
           3  +
#[derive(Debug)]
           4  +
pub struct SignedEvent<T> {
           5  +
    /// The actual event message
           6  +
    pub message: T,
           7  +
    /// Signature information if the message was signed
           8  +
    pub signature: ::std::option::Option<crate::sigv4_event_stream::SignatureInfo>,
           9  +
}
          10  +
          11  +
/// Error wrapper for signed event stream errors
          12  +
#[derive(Debug)]
          13  +
pub enum SignedEventError<E> {
          14  +
    /// Error from the underlying event stream
          15  +
    Event(E),
          16  +
    /// Error extracting signed message
          17  +
    InvalidSignedEvent(crate::sigv4_event_stream::ExtractionError),
          18  +
}
          19  +
          20  +
impl<E> From<E> for SignedEventError<E> {
          21  +
    fn from(err: E) -> Self {
          22  +
        SignedEventError::Event(err)
          23  +
    }
          24  +
}
          25  +
          26  +
/// Information extracted from a signed event stream message
          27  +
#[non_exhaustive]
          28  +
#[derive(Debug, Clone)]
          29  +
pub struct SignatureInfo {
          30  +
    /// The chunk signature bytes from the `:chunk-signature` header
          31  +
    pub chunk_signature: Vec<u8>,
          32  +
    /// The timestamp from the `:date` header
          33  +
    pub timestamp: ::std::time::SystemTime,
          34  +
}
          35  +
          36  +
/// Error type for signed message extraction operations
          37  +
#[non_exhaustive]
          38  +
#[derive(Debug)]
          39  +
pub enum ExtractionError {
          40  +
    /// The payload could not be decoded as a valid message
          41  +
    #[non_exhaustive]
          42  +
    InvalidPayload {
          43  +
        error: ::aws_smithy_eventstream::error::Error,
          44  +
    },
          45  +
    /// The timestamp header is missing or has an invalid format
          46  +
    #[non_exhaustive]
          47  +
    InvalidTimestamp,
          48  +
}
          49  +
          50  +
/// Unmarshaller wrapper that handles SigV4 signed event stream messages
          51  +
#[derive(Debug)]
          52  +
pub struct SigV4Unmarshaller<T> {
          53  +
    inner: T,
          54  +
}
          55  +
          56  +
impl<T> SigV4Unmarshaller<T> {
          57  +
    pub fn new(inner: T) -> Self {
          58  +
        Self { inner }
          59  +
    }
          60  +
}
          61  +
          62  +
impl<T> ::aws_smithy_eventstream::frame::UnmarshallMessage for SigV4Unmarshaller<T>
          63  +
where
          64  +
    T: ::aws_smithy_eventstream::frame::UnmarshallMessage,
          65  +
{
          66  +
    type Output = crate::sigv4_event_stream::SignedEvent<T::Output>;
          67  +
    type Error = crate::sigv4_event_stream::SignedEventError<T::Error>;
          68  +
          69  +
    fn unmarshall(
          70  +
        &self,
          71  +
        message: &::aws_smithy_types::event_stream::Message,
          72  +
    ) -> ::std::result::Result<
          73  +
        ::aws_smithy_eventstream::frame::UnmarshalledMessage<Self::Output, Self::Error>,
          74  +
        ::aws_smithy_eventstream::error::Error,
          75  +
    > {
          76  +
        // First, try to extract the signed message
          77  +
        match crate::sigv4_event_stream::extract_signed_message(message) {
          78  +
            Ok(MaybeSignedMessage::Signed {
          79  +
                message: inner_message,
          80  +
                signature,
          81  +
            }) => {
          82  +
                // Process the inner message with the base unmarshaller
          83  +
                match self.inner.unmarshall(&inner_message) {
          84  +
                    Ok(unmarshalled) => match unmarshalled {
          85  +
                        ::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(event) => {
          86  +
                            Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(
          87  +
                                crate::sigv4_event_stream::SignedEvent {
          88  +
                                    message: event,
          89  +
                                    signature: Some(signature),
          90  +
                                },
          91  +
                            ))
          92  +
                        }
          93  +
                        ::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(err) => {
          94  +
                            Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
          95  +
                                crate::sigv4_event_stream::SignedEventError::Event(err),
          96  +
                            ))
          97  +
                        }
          98  +
                    },
          99  +
                    Err(err) => Err(err),
         100  +
                }
         101  +
            }
         102  +
            Ok(MaybeSignedMessage::Unsigned) => {
         103  +
                // Process unsigned message directly
         104  +
                match self.inner.unmarshall(message) {
         105  +
                    Ok(unmarshalled) => match unmarshalled {
         106  +
                        ::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(event) => {
         107  +
                            Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(
         108  +
                                crate::sigv4_event_stream::SignedEvent {
         109  +
                                    message: event,
         110  +
                                    signature: None,
         111  +
                                },
         112  +
                            ))
         113  +
                        }
         114  +
                        ::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(err) => {
         115  +
                            Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
         116  +
                                crate::sigv4_event_stream::SignedEventError::Event(err),
         117  +
                            ))
         118  +
                        }
         119  +
                    },
         120  +
                    Err(err) => Err(err),
         121  +
                }
         122  +
            }
         123  +
            Err(extraction_err) => Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
         124  +
                crate::sigv4_event_stream::SignedEventError::InvalidSignedEvent(extraction_err),
         125  +
            )),
         126  +
        }
         127  +
    }
         128  +
}
         129  +
         130  +
/// Result of extracting a potentially signed message
         131  +
#[derive(Debug)]
         132  +
pub enum MaybeSignedMessage {
         133  +
    /// Message was signed and has been extracted
         134  +
    Signed {
         135  +
        /// The inner message that was signed
         136  +
        message: ::aws_smithy_types::event_stream::Message,
         137  +
        /// Signature information from the outer message
         138  +
        signature: crate::sigv4_event_stream::SignatureInfo,
         139  +
    },
         140  +
    /// Message was not signed (no `:chunk-signature` header present)
         141  +
    Unsigned,
         142  +
}
         143  +
         144  +
/// Extracts the inner message from a potentially signed event stream message.
         145  +
pub fn extract_signed_message(
         146  +
    message: &::aws_smithy_types::event_stream::Message,
         147  +
) -> ::std::result::Result<MaybeSignedMessage, crate::sigv4_event_stream::ExtractionError> {
         148  +
    // Check if message has chunk signature
         149  +
    let mut chunk_signature = None;
         150  +
    let mut timestamp = None;
         151  +
         152  +
    for header in message.headers() {
         153  +
        match header.name().as_str() {
         154  +
            ":chunk-signature" => {
         155  +
                if let ::aws_smithy_types::event_stream::HeaderValue::ByteArray(bytes) =
         156  +
                    header.value()
         157  +
                {
         158  +
                    chunk_signature = Some(bytes.as_ref().to_vec());
         159  +
                }
         160  +
            }
         161  +
            ":date" => {
         162  +
                if let ::aws_smithy_types::event_stream::HeaderValue::Timestamp(ts) = header.value()
         163  +
                {
         164  +
                    timestamp = Some(::std::time::SystemTime::try_from(*ts).map_err(|_err| {
         165  +
                        crate::sigv4_event_stream::ExtractionError::InvalidTimestamp
         166  +
                    })?);
         167  +
                } else {
         168  +
                    return Err(crate::sigv4_event_stream::ExtractionError::InvalidTimestamp);
         169  +
                }
         170  +
            }
         171  +
            _ => {}
         172  +
        }
         173  +
    }
         174  +
         175  +
    let Some(chunk_signature) = chunk_signature else {
         176  +
        return Ok(MaybeSignedMessage::Unsigned);
         177  +
    };
         178  +
         179  +
    let Some(timestamp) = timestamp else {
         180  +
        return Err(crate::sigv4_event_stream::ExtractionError::InvalidTimestamp);
         181  +
    };
         182  +
         183  +
    // Extract inner message
         184  +
    let cursor = ::std::io::Cursor::new(message.payload());
         185  +
    let inner_message = ::aws_smithy_eventstream::frame::read_message_from(cursor)
         186  +
        .map_err(|err| crate::sigv4_event_stream::ExtractionError::InvalidPayload { error: err })?;
         187  +
         188  +
    Ok(MaybeSignedMessage::Signed {
         189  +
        message: inner_message,
         190  +
        signature: crate::sigv4_event_stream::SignatureInfo {
         191  +
            chunk_signature,
         192  +
            timestamp,
         193  +
        },
         194  +
    })
         195  +
}