diff --git a/src/object/types.rs b/src/object/types.rs index ece1ba3bde..913c43358a 100644 --- a/src/object/types.rs +++ b/src/object/types.rs @@ -24,14 +24,6 @@ impl ExtractType for Tagged { } } -impl ExtractType for Value { - fn extract(value: &Tagged) -> Result { - trace!(" Extracting {:?} for Value", value); - - Ok(value.item().clone()) - } -} - impl ExtractType for bool { fn extract(value: &Tagged) -> Result { trace!("Extracting {:?} for bool", value); diff --git a/src/parser/deserializer.rs b/src/parser/deserializer.rs index c3d9370872..1b5f34bfda 100644 --- a/src/parser/deserializer.rs +++ b/src/parser/deserializer.rs @@ -323,6 +323,13 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut ConfigDeserializer<'de> { let value = self.pop(); + let type_name = std::any::type_name::(); + let tagged_val_name = std::any::type_name::>(); + + if name == tagged_val_name { + return visit::, _>(value.val, name, fields, visitor); + } + if name == "Block" { let block = match value.val { Tagged { @@ -331,11 +338,10 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut ConfigDeserializer<'de> { } => block, other => return Err(ShellError::type_error("Block", other.tagged_type_name())), }; - return visit(block, name, fields, visitor); + return visit::(block, name, fields, visitor); } - let name = std::any::type_name::(); - trace!("Extracting {:?} for {:?}", value.val, name); + trace!("Extracting {:?} for {:?}", value.val, type_name); V::Value::extract(&value.val) } fn deserialize_enum(