使用xml-rs xml :: reader :: Error返回自定义错误

时间:2017-05-25 13:15:54

标签: error-handling rust xml-rs

我使用xml-rs进行一些xml解析,并且在某些特殊情况下我想发出自定义xml::reader::Error。此错误结构实现为:

pub struct Error {
    pos: TextPosition,
    kind: ErrorKind,
}

poskind属性是私有的,因此我无法手动实例化Error,并且没有new()方法或类似的东西。

我所拥有的是From实施:

impl<'a, P, M> From<(&'a P, M)> for Error where P: Position, M: Into<Cow<'static, str>> {
    fn from(orig: (&'a P, M)) -> Self {
        Error{
            pos: orig.0.position(),
            kind: ErrorKind::Syntax(orig.1.into())
        }
    }
}

我可以使用它来实例化自定义错误,我需要一个P,它意味着一种实现xml::common::Position特征的类型和一个M Into<Cow<'static, str>>。< / p>

对于P,我认为我可以使用xml::reader::EventReader,因为它实现了xml::common::Position。但我不确定如何获得Into<Cow<'static, str>>

我尝试过这样的事情:

(event_reader, "custom error").into()

但它不起作用,我认为因为"custom error"无法转换为Into<Cow<'static, str>>或类似的东西。

我收到的错误信息是:

error[E0277]: the trait bound `xml::reader::Error: std::convert::From<(xml::EventReader<std::io::BufReader<&[u8]>>, &str)>` is not satisfied
   --> src/main.rs:234:78
    |
234 |                                     _ => return Err((event_reader, "custom error").into()),
    |                                                                                    ^^^^ the trait `std::convert::From<(xml::EventReader<std::io::BufReader<&[u8]>>, &str)>` is not implemented for `xml::reader::Error`
    |
    = help: the following implementations were found:
              <xml::reader::Error as std::convert::From<(&'a P, M)>>
              <xml::reader::Error as std::convert::From<xml::util::CharReadError>>
              <xml::reader::Error as std::convert::From<std::io::Error>>
    = note: required because of the requirements on the impl of `std::convert::Into<xml::reader::Error>` for `(xml::EventReader<std::io::BufReader<&[u8]>>, &str)`

可以看出,从错误中,Rust无法将我的(event_reader, "custom error")元组转换为可用的xml::reader::Error as std::convert::From<(&'a P, M)>实现。

这就是我想知道为什么以及如何解决的问题。

1 个答案:

答案 0 :(得分:1)

问题是我没有将&添加到event_reader。添加它修复了问题,现在调用From实现,我可以实例化xml::reader::Error

(&event_reader, "custom error").into()