Expand description
§Dynamically-typed XSOs
This module provides the utilities to make dynamically-typed XSOs work.
Dynamically typed XSOs are contained in Xso<dyn Trait>
, where
Trait
is a trait provided by the user.
The given Trait
constrains the specific types which can be used in the
Xso<dyn Trait>
box. This allows users to provide additional methods on
the trait which are available on all Xso<dyn Trait>
objects via the
Deref
and DerefMut
implementations.
§Creating a new Trait
In order to be usable within Xso<dyn Trait>
, a trait must satisfy the
following constraints:
dyn Trait
must implementDynXso
.dyn Trait
must implementMayContain<T>
for allT
which implementTrait
.
The easiest and most forward-compatible way of providing these
implementations is the derive_dyn_traits
macro.
§Example
trait MyPayload: Any {}
derive_dyn_traits!(MyPayload);
#[derive(FromXml, Debug, PartialEq)]
#[xml(namespace = "urn:example", name = "foo")]
struct Foo;
impl MyPayload for Foo {}
Xso::<dyn MyPayload>::register_type::<Foo>();
#[derive(FromXml, Debug, PartialEq)]
#[xml(namespace = "urn:example", name = "bar")]
struct Bar;
impl MyPayload for Bar {}
Xso::<dyn MyPayload>::register_type::<Bar>();
let x: Xso<dyn MyPayload> = from_bytes("<foo xmlns='urn:example'/>".as_bytes()).unwrap();
assert_eq!(Foo, *x.downcast::<Foo>().unwrap());
let x: Xso<dyn MyPayload> = from_bytes("<bar xmlns='urn:example'/>".as_bytes()).unwrap();
assert_eq!(Bar, *x.downcast::<Bar>().unwrap());
Modules§
Structs§
- Builder
Registry std
- Registry for type-erased
FromXml
builders which constructT
- DynBuilder
- Wrapper around a
FromEventsBuilder
to convert aBox<T>
output to aXso<T>
output. - Unbox
Builder - Wrapper around a
FromEventsBuilder
to convert aBox<T>
output to aT
output. - Xso
- Dynamic XSO container
- XsoVec
- Container for dynamically-typed XSOs optimized for type-keyed access
Enums§
- Take
OneError - Error type for retrieving a single item from
XsoVec
.
Traits§
- DynXso
- Dynamic XSO type
- MayContain
- Declare that
T
may be held byBox<Self>