Skip to content

Commit 8dbb315

Browse files
committed
wip
1 parent a0c24bf commit 8dbb315

File tree

1 file changed

+14
-20
lines changed
  • rust/signed_doc/src/metadata

1 file changed

+14
-20
lines changed

rust/signed_doc/src/metadata/mod.rs

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)