我正在使用解析器组合器Nom来编写 TOML 解析器。我遇到问题的解析器函数使用chrono crate 解析日期时间字符串。
fn offset_datetime<'a, E: ParseError<&'a str>>(input: &'a str) -> IResult<&'a str, TomlValue, E> {
match DateTime::parse_from_rfc3339(input) {
ParseResult::Ok(dt) => IResult::Ok(("", TomlValue::OffsetDateTime(dt))),
ParseResult::Err(e) => {
Err(Err::Error(Error::from_error_kind(input, ErrorKind::Fail)))
}
}
}
在上面的代码中,我使用 解析一个字符串切片chrono::DatetTime::parse_from_rfc3339
,它返回一个chrono::format::ParseResult
. 然后,我正在匹配它,以便将其转换为正确的nom::IResult
. ParseResult::Ok
手臂很好,但我无法为ParseResult::Err
. 这是我在编译上面的代码片段时遇到的错误:
error[E0308]: mismatched types
--> src/parser.rs:193:28
|
188 | fn offset_datetime<'a, E: ParseError<&'a str>>(input: &'a str) -> IResult<&'a str, TomlValue, E> {
| - this type parameter
...
193 | Err(Err::Error(Error::from_error_kind(input, ErrorKind::Fail)))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected type parameter `E`, found struct `nom::error::Error`
|
= note: expected type parameter `E`
found struct `nom::error::Error<&str>`
Error
fromError::from_error_kind
是 Nom 自己的结构之一,它确实实现了trait ParseError
,就像E
泛型指定的那样。为什么编译器不能识别这个?