1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- use std::any::Any;
- use anyhow::Result;
- pub struct BoxAny(Box<dyn Any + Send + Sync + 'static>);
- impl BoxAny {
- pub fn new<T>(value: T) -> Self
- where
- T: Send + Sync + 'static,
- {
- Self(Box::new(value))
- }
- pub fn unbox_or_default<T>(self) -> T
- where
- T: Default + 'static,
- {
- match self.0.downcast::<T>() {
- Ok(value) => *value,
- Err(_) => T::default(),
- }
- }
- pub fn unbox_or_error<T>(self) -> Result<T>
- where
- T: Default + 'static,
- {
- match self.0.downcast::<T>() {
- Ok(value) => Ok(*value),
- Err(e) => Err(anyhow::anyhow!(
- "downcast error to {} failed: {:?}",
- std::any::type_name::<T>(),
- e
- )),
- }
- }
- pub fn unbox_or_none<T>(self) -> Option<T>
- where
- T: Default + 'static,
- {
- match self.0.downcast::<T>() {
- Ok(value) => Some(*value),
- Err(_) => None,
- }
- }
- #[allow(dead_code)]
- pub fn downcast_ref<T: 'static>(&self) -> Option<&T> {
- self.0.downcast_ref()
- }
- }
|