我使用xml-rs
进行一些xml解析,并且在某些特殊情况下我想发出自定义xml::reader::Error
。此错误结构实现为:
pub struct Error {
pos: TextPosition,
kind: ErrorKind,
}
pos
和kind
属性是私有的,因此我无法手动实例化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)>
实现。
这就是我想知道为什么以及如何解决的问题。
答案 0 :(得分:1)
问题是我没有将&
添加到event_reader。添加它修复了问题,现在调用From
实现,我可以实例化xml::reader::Error
:
(&event_reader, "custom error").into()