Module dynxso

Source
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 implement DynXso.
  • dyn Trait must implement MayContain<T> for all T which implement Trait.

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§

registry
Helper traits for dynamic XSO builder registries.
xso_vec
Helper types for XsoVec.

Structs§

BuilderRegistrystd
Registry for type-erased FromXml builders which construct T
DynBuilder
Wrapper around a FromEventsBuilder to convert a Box<T> output to a Xso<T> output.
UnboxBuilder
Wrapper around a FromEventsBuilder to convert a Box<T> output to a T output.
Xso
Dynamic XSO container
XsoVec
Container for dynamically-typed XSOs optimized for type-keyed access

Enums§

TakeOneError
Error type for retrieving a single item from XsoVec.

Traits§

DynXso
Dynamic XSO type
MayContain
Declare that T may be held by Box<Self>