xso: make FromEventsBuilder implementations around Box more versatile

Jonas Schäfer created

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

xso/src/fromxml.rs 🔗

@@ -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 },