xso: make FromEventsBuilder implementations around Box more versatile
Jonas Schäfer
created 8 months ago
By removing the implicit `Sized` bound, they can be used with `dyn _`.
The `Sized` bound is unnecessary for a boxed value, so it is a
superfluous restriction. Also, the use with `dyn _` may turn out useful
in the future when we want to allow type-erased XSOs.
Change summary
xso/src/fromxml.rs | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
Detailed changes
@@ -84,9 +84,9 @@ impl<T: FromXml> FromXml for Option<T> {
}
/// Helper struct to construct an `Box<T>` from XML events.
-pub struct BoxBuilder<T: FromEventsBuilder>(Box<T>);
+pub struct BoxBuilder<T: FromEventsBuilder + ?Sized>(Box<T>);
-impl<T: FromEventsBuilder> FromEventsBuilder for BoxBuilder<T> {
+impl<T: FromEventsBuilder + ?Sized> FromEventsBuilder for BoxBuilder<T> {
type Output = Box<T::Output>;
fn feed(&mut self, ev: rxml::Event, ctx: &Context<'_>) -> Result<Option<Self::Output>, Error> {
@@ -94,8 +94,8 @@ impl<T: FromEventsBuilder> FromEventsBuilder for BoxBuilder<T> {
}
}
-/// Parsers `T` into a `Box`.
-impl<T: FromXml> FromXml for Box<T> {
+/// Parses `T` into a `Box`.
+impl<T: FromXml + ?Sized> FromXml for Box<T> {
type Builder = BoxBuilder<T::Builder>;
fn from_events(
@@ -107,6 +107,14 @@ impl<T: FromXml> FromXml for Box<T> {
}
}
+impl<T: FromEventsBuilder + ?Sized> FromEventsBuilder for Box<T> {
+ type Output = T::Output;
+
+ fn feed(&mut self, ev: rxml::Event, ctx: &Context<'_>) -> Result<Option<Self::Output>, Error> {
+ (**self).feed(ev, ctx)
+ }
+}
+
#[derive(Debug)]
enum FallibleBuilderInner<T: FromEventsBuilder, E> {
Processing { depth: usize, builder: T },