pub struct Xso<T: ?Sized> { /* private fields */ }
Expand description
§Dynamic XSO container
This container is very similar to Box<_>
, but geared specifically toward
the use with T
being a dyn Trait
. It also implements FromXml
(unconditionally) and AsXml
if T
implements AsXmlDyn
.
In order to provide these features, T
must implement DynXso
and
MayContain
. Implementations for these traits can be generated using
derive_dyn_traits
.
Most methods on Xso<dyn Trait>
which take type parameters are only
available for types U
implementing Trait
(or, more precisely, where
dyn Trait
implements MayContain<U>
).
Implementations§
Source§impl<T: ?Sized> Xso<T>
impl<T: ?Sized> Xso<T>
Sourcepub fn wrap<U: 'static>(value: U) -> Selfwhere
T: MayContain<U>,
pub fn wrap<U: 'static>(value: U) -> Selfwhere
T: MayContain<U>,
Wrap a value into a Xso<dyn Trait>
.
trait Trait: Any {}
derive_dyn_traits!(Trait);
struct Foo;
impl Trait for Foo {}
let x: Xso<dyn Trait> = Xso::wrap(Foo);
Sourcepub fn into_boxed(self) -> Box<T>
pub fn into_boxed(self) -> Box<T>
Convert Xso<T>
into Box<T>
.
trait Trait: Any {}
derive_dyn_traits!(Trait);
struct Foo;
impl Trait for Foo {}
let x: Xso<dyn Trait> = Xso::wrap(Foo);
let x: Box<dyn Trait> = x.into_boxed();
Source§impl<T: DynXso + ?Sized + 'static> Xso<T>
impl<T: DynXso + ?Sized + 'static> Xso<T>
Sourcepub fn downcast<U: 'static>(self) -> Result<Box<U>, Self>where
T: MayContain<U>,
pub fn downcast<U: 'static>(self) -> Result<Box<U>, Self>where
T: MayContain<U>,
Downcast self
to Box<U>
.
If the downcast fails, self
is returned without change.
trait Trait: Any {}
derive_dyn_traits!(Trait);
struct Foo;
impl Trait for Foo {}
struct Bar;
impl Trait for Bar {}
let x: Xso<dyn Trait> = Xso::wrap(Foo);
// Does not contain a Bar, so downcast fails.
let x: Xso<dyn Trait> = x.downcast::<Bar>().err().unwrap();
// *Does* contain a Foo, so downcast succeeds.
let f: Foo = *x.downcast().unwrap();
Sourcepub fn downcast_ref<U: 'static>(&self) -> Option<&U>where
T: MayContain<U>,
pub fn downcast_ref<U: 'static>(&self) -> Option<&U>where
T: MayContain<U>,
Downcast &self
to &U
.
trait Trait: Any {}
derive_dyn_traits!(Trait);
struct Foo;
impl Trait for Foo {}
struct Bar;
impl Trait for Bar {}
let x: Xso<dyn Trait> = Xso::wrap(Foo);
// Does not contain a Bar, so downcast fails.
assert!(x.downcast_ref::<Bar>().is_none());
// *Does* contain a Foo, so downcast succeeds.
let f: &Foo = x.downcast_ref().unwrap();
Sourcepub fn downcast_mut<U: 'static>(&mut self) -> Option<&mut U>where
T: MayContain<U>,
pub fn downcast_mut<U: 'static>(&mut self) -> Option<&mut U>where
T: MayContain<U>,
Downcast &mut self
to &mut U
.
trait Trait: Any {}
derive_dyn_traits!(Trait);
struct Foo;
impl Trait for Foo {}
struct Bar;
impl Trait for Bar {}
let mut x: Xso<dyn Trait> = Xso::wrap(Foo);
// Does not contain a Bar, so downcast fails.
assert!(x.downcast_mut::<Bar>().is_none());
// *Does* contain a Foo, so downcast succeeds.
let f: &mut Foo = x.downcast_mut().unwrap();
Source§impl<R: DynXsoRegistryAdd<T> + 'static, T: DynXso<Registry = R> + ?Sized + 'static> Xso<T>
impl<R: DynXsoRegistryAdd<T> + 'static, T: DynXso<Registry = R> + ?Sized + 'static> Xso<T>
Sourcepub fn register_type<U: FromXml + 'static>()where
T: MayContain<U>,
pub fn register_type<U: FromXml + 'static>()where
T: MayContain<U>,
Register a new type to be constructible.
Only types registered through this function can be parsed from XML via
the FromXml
implementation on Xso<T>
. See
dynxso
for details.
trait Trait: Any {}
derive_dyn_traits!(Trait);
#[derive(FromXml, PartialEq, Debug)]
#[xml(namespace = "urn:example", name = "foo")]
struct Foo;
impl Trait for Foo {}
// Parsing fails, because register_type() has not been called for
// Foo:
assert!(from_bytes::<Xso<dyn Trait>>("<foo xmlns='urn:example'/>".as_bytes()).is_err());
Xso::<dyn Trait>::register_type::<Foo>();
// After registering Foo with Xso<dyn Trait>, parsing succeeds and
// we can downcast to Foo:
let x: Xso<dyn Trait> = from_bytes("<foo xmlns='urn:example'/>".as_bytes()).unwrap();
assert_eq!(Foo, *x.downcast().unwrap());
Trait Implementations§
Source§impl<T: DynXso + AsXmlDyn + ?Sized + 'static> AsXml for Xso<T>
impl<T: DynXso + AsXmlDyn + ?Sized + 'static> AsXml for Xso<T>
Source§type ItemIter<'x> = Box<dyn Iterator<Item = Result<Item<'x>, Error>> + 'x>
type ItemIter<'x> = Box<dyn Iterator<Item = Result<Item<'x>, Error>> + 'x>
Source§fn as_xml_iter(&self) -> Result<Self::ItemIter<'_>, Error>
fn as_xml_iter(&self) -> Result<Self::ItemIter<'_>, Error>
Item
items.Source§fn as_xml_dyn_iter(&self) -> Result<Self::ItemIter<'_>, Error>
fn as_xml_dyn_iter(&self) -> Result<Self::ItemIter<'_>, Error>
as_xml_iter
, but
boxed to erase the concrete iterator type. Read moreSource§impl<T: DynXso + ?Sized + 'static> Extend<Xso<T>> for XsoVec<T>
impl<T: DynXso + ?Sized + 'static> Extend<Xso<T>> for XsoVec<T>
Source§fn extend<I: IntoIterator<Item = Xso<T>>>(&mut self, iter: I)
fn extend<I: IntoIterator<Item = Xso<T>>>(&mut self, iter: I)
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one
)Source§impl<R: DynXsoRegistryLookup<T> + 'static, T: DynXso<Registry = R> + ?Sized + 'static> FromXml for Xso<T>
impl<R: DynXsoRegistryLookup<T> + 'static, T: DynXso<Registry = R> + ?Sized + 'static> FromXml for Xso<T>
Source§type Builder = DynBuilder<Box<dyn FromEventsBuilder<Output = Box<T>>>>
type Builder = DynBuilder<Box<dyn FromEventsBuilder<Output = Box<T>>>>
Source§fn from_events(
name: QName,
attrs: AttrMap,
ctx: &Context<'_>,
) -> Result<Self::Builder, FromEventsError>
fn from_events( name: QName, attrs: AttrMap, ctx: &Context<'_>, ) -> Result<Self::Builder, FromEventsError>
Source§fn xml_name_matcher() -> XmlNameMatcher<'static>
fn xml_name_matcher() -> XmlNameMatcher<'static>
Self
may be parsed from
a given XML element. Read more