Add support for deserialization of custom type/shared value from into another Dynamic.

This commit is contained in:
Stephen Chung
2023-04-28 23:16:00 +08:00
parent 72cfd42ab7
commit ae59a3321b
6 changed files with 65 additions and 19 deletions

View File

@@ -1184,89 +1184,89 @@ impl Dynamic {
self.flatten_in_place();
if TypeId::of::<T>() == TypeId::of::<Self>() {
return Some(reify! { self => T });
return Some(reify! { self => !!! T });
}
if TypeId::of::<T>() == TypeId::of::<()>() {
return match self.0 {
Union::Unit(..) => Some(reify! { () => T }),
Union::Unit(..) => Some(reify! { () => !!! T }),
_ => None,
};
}
if TypeId::of::<T>() == TypeId::of::<INT>() {
return match self.0 {
Union::Int(n, ..) => Some(reify! { n => T }),
Union::Int(n, ..) => Some(reify! { n => !!! T }),
_ => None,
};
}
#[cfg(not(feature = "no_float"))]
if TypeId::of::<T>() == TypeId::of::<crate::FLOAT>() {
return match self.0 {
Union::Float(v, ..) => Some(reify! { *v => T }),
Union::Float(v, ..) => Some(reify! { *v => !!! T }),
_ => None,
};
}
#[cfg(feature = "decimal")]
if TypeId::of::<T>() == TypeId::of::<rust_decimal::Decimal>() {
return match self.0 {
Union::Decimal(v, ..) => Some(reify! { *v => T }),
Union::Decimal(v, ..) => Some(reify! { *v => !!! T }),
_ => None,
};
}
if TypeId::of::<T>() == TypeId::of::<bool>() {
return match self.0 {
Union::Bool(b, ..) => Some(reify! { b => T }),
Union::Bool(b, ..) => Some(reify! { b => !!! T }),
_ => None,
};
}
if TypeId::of::<T>() == TypeId::of::<ImmutableString>() {
return match self.0 {
Union::Str(s, ..) => Some(reify! { s => T }),
Union::Str(s, ..) => Some(reify! { s => !!! T }),
_ => None,
};
}
if TypeId::of::<T>() == TypeId::of::<String>() {
return match self.0 {
Union::Str(s, ..) => Some(reify! { s.to_string() => T }),
Union::Str(s, ..) => Some(reify! { s.to_string() => !!! T }),
_ => None,
};
}
if TypeId::of::<T>() == TypeId::of::<char>() {
return match self.0 {
Union::Char(c, ..) => Some(reify! { c => T }),
Union::Char(c, ..) => Some(reify! { c => !!! T }),
_ => None,
};
}
#[cfg(not(feature = "no_index"))]
if TypeId::of::<T>() == TypeId::of::<crate::Array>() {
return match self.0 {
Union::Array(a, ..) => Some(reify! { *a => T }),
Union::Array(a, ..) => Some(reify! { *a => !!! T }),
_ => None,
};
}
#[cfg(not(feature = "no_index"))]
if TypeId::of::<T>() == TypeId::of::<crate::Blob>() {
return match self.0 {
Union::Blob(b, ..) => Some(reify! { *b => T }),
Union::Blob(b, ..) => Some(reify! { *b => !!! T }),
_ => None,
};
}
#[cfg(not(feature = "no_object"))]
if TypeId::of::<T>() == TypeId::of::<crate::Map>() {
return match self.0 {
Union::Map(m, ..) => Some(reify! { *m => T }),
Union::Map(m, ..) => Some(reify! { *m => !!! T }),
_ => None,
};
}
if TypeId::of::<T>() == TypeId::of::<FnPtr>() {
return match self.0 {
Union::FnPtr(f, ..) => Some(reify! { *f => T }),
Union::FnPtr(f, ..) => Some(reify! { *f => !!! T }),
_ => None,
};
}
#[cfg(not(feature = "no_time"))]
if TypeId::of::<T>() == TypeId::of::<Instant>() {
return match self.0 {
Union::TimeStamp(t, ..) => Some(reify! { *t => T }),
Union::TimeStamp(t, ..) => Some(reify! { *t => !!! T }),
_ => None,
};
}
@@ -1306,7 +1306,7 @@ impl Dynamic {
pub fn cast<T: Any + Clone>(self) -> T {
// Bail out early if the return type needs no cast
if TypeId::of::<T>() == TypeId::of::<Self>() {
return reify! { self => T };
return reify! { self => !!! T };
}
#[cfg(not(feature = "no_closure"))]
@@ -2038,7 +2038,7 @@ impl Dynamic {
})
.collect(),
Union::Blob(b, ..) if TypeId::of::<T>() == TypeId::of::<u8>() => {
Ok(reify! { *b => Vec<T> })
Ok(reify! { *b => !!! Vec<T> })
}
#[cfg(not(feature = "no_closure"))]
Union::Shared(ref cell, ..) => {
@@ -2061,7 +2061,7 @@ impl Dynamic {
.collect()
}
Union::Blob(ref b, ..) if TypeId::of::<T>() == TypeId::of::<u8>() => {
Ok(reify! { b.clone() => Vec<T> })
Ok(reify! { b.clone() => !!! Vec<T> })
}
_ => Err(cell.type_name()),
}