@@ -147,11 +147,14 @@ impl Metadata {
147147 }
148148
149149 /// Build `Metadata` object from the metadata fields, doing all necessary validation.
150- pub ( crate ) fn from_fields ( fields : Vec < SupportedField > , report : & ProblemReport ) -> Self {
150+ pub ( crate ) fn from_fields < E > (
151+ fields : impl Iterator < Item = Result < SupportedField , E > > , report : & ProblemReport ,
152+ ) -> Result < Self , E > {
151153 const REPORT_CONTEXT : & str = "Metadata building" ;
152154
153155 let mut metadata = Metadata ( BTreeMap :: new ( ) ) ;
154156 for v in fields {
157+ let v = v?;
155158 let k = v. discriminant ( ) ;
156159 if metadata. 0 . insert ( k, v) . is_some ( ) {
157160 report. duplicate_field (
@@ -175,14 +178,17 @@ impl Metadata {
175178 report. missing_field ( "content-type" , REPORT_CONTEXT ) ;
176179 }
177180
178- metadata
181+ Ok ( metadata)
179182 }
180183
181184 /// Build `Metadata` object from the metadata fields, doing all necessary validation.
182185 pub ( crate ) fn from_json ( fields : serde_json:: Value ) -> anyhow:: Result < Self > {
183186 let fields = serde:: Deserializer :: deserialize_map ( fields, MetadataDeserializeVisitor ) ?;
184187 let report = ProblemReport :: new ( "Deserializing metadata from json" ) ;
185- let metadata = Self :: from_fields ( fields, & report) ;
188+ let metadata = Self :: from_fields (
189+ fields. into_iter ( ) . map ( |v| anyhow:: Result :: < _ > :: Ok ( v) ) ,
190+ & report,
191+ ) ?;
186192 anyhow:: ensure!( !report. is_problematic( ) , "{:?}" , report) ;
187193 Ok ( metadata)
188194 }
@@ -247,9 +253,6 @@ impl minicbor::Decode<'_, crate::decode_context::DecodeContext<'_>> for Metadata
247253 fn decode (
248254 d : & mut Decoder < ' _ > , ctx : & mut crate :: decode_context:: DecodeContext < ' _ > ,
249255 ) -> Result < Self , minicbor:: decode:: Error > {
250- const REPORT_CONTEXT : & str = "Metadata decoding" ;
251- let mut metadata_map = BTreeMap :: new ( ) ;
252-
253256 // TODO: use helpers from `cbork-utils` crate to verify that's the map is
254257 // deterministically CBOR encoded map.
255258
@@ -259,21 +262,12 @@ impl minicbor::Decode<'_, crate::decode_context::DecodeContext<'_>> for Metadata
259262 ) ) ;
260263 } ;
261264
262- for _ in 0 ..length {
263- let Some ( field) = Option :: < SupportedField > :: decode ( d, ctx) ? else {
264- continue ;
265- } ;
266- let field_label = field. discriminant ( ) ;
267- if metadata_map. insert ( field_label, field) . is_some ( ) {
268- ctx. report . duplicate_field (
269- & field_label. to_string ( ) ,
270- "Duplicate metadata fields are not allowed" ,
271- REPORT_CONTEXT ,
272- ) ;
273- }
274- }
265+ let report = ctx. report . clone ( ) ;
266+ let fields = ( 0 ..length)
267+ . map ( |_| Option :: < SupportedField > :: decode ( d, ctx) )
268+ . filter_map ( |v| v. transpose ( ) ) ;
275269
276- Ok ( Self ( metadata_map ) )
270+ Self :: from_fields ( fields , & report )
277271 }
278272}
279273
0 commit comments