diff --git a/console/src/tasks.rs b/console/src/tasks.rs index 666119e9d..820880fc9 100644 --- a/console/src/tasks.rs +++ b/console/src/tasks.rs @@ -161,24 +161,37 @@ impl State { .drain(..) .filter_map(|f| { let field_name = f.name.as_ref()?; - let name: Option> = match field_name { - proto::field::Name::StrName(n) => Some(n.clone().into()), + let name: Arc = match field_name { + proto::field::Name::StrName(n) => n.clone().into(), proto::field::Name::NameIdx(idx) => { debug_assert_eq!( f.metadata_id.map(|m| m.id), Some(meta_id), "malformed field name: metadata ID mismatch!" ); - meta.field_names.get(*idx as usize).cloned() + let name = meta.field_names.get(*idx as usize).cloned(); + if name.is_none() { + tracing::warn!(index = idx, "missing field name for"); + }; + name? } }; - let mut value: FieldValue = f.value.as_ref().expect("no value").clone().into(); - name.map(|name| { - if &*name == "spawn.location" { - value = value.truncate_registry_path(); - } - Field { name, value } - }) + + let value = f.value; + debug_assert!( + value.is_some(), + "missing field value for field `{:?}`", + name + ); + let mut value = FieldValue::from(value?) + // if the value is an empty string, just skip it. + .ensure_nonempty()?; + + if &*name == "spawn.location" { + value = value.truncate_registry_path(); + } + + Some(Field { name, value }) }) .collect(); @@ -494,4 +507,12 @@ impl FieldValue { }; FieldValue::Debug(s) } + + /// If `self` is an empty string, returns `None`. Otherwise, returns `Some(self)`. + fn ensure_nonempty(self) -> Option { + match self { + FieldValue::Debug(s) | FieldValue::Str(s) if s.is_empty() => None, + val => Some(val), + } + } }