如果我想编写一个可能在内部失败的名称解析器,我如何传播错误?
作为一个例子,解析NaiveDate
的东西可能看起来像:
fn parse_date(i: &str) -> IResult<&str, NaiveDate> {
map(take(10), |s| NaiveDate::parse_from_str(s, "%m/%d/%Y")?)(i)
}
parse_from_str
可能失败,返回自己的ParseResult
类型。
我实际上依赖于它的成功/失败来确定这个解析器是否工作。
我如何将内部结果(在本例中为chrono::format::ParseResult
)转换为与nom一起工作的东西?
您可以使用Nom的map_res
方法。MapRes只发出ErrorKind::MapRes
(没有自定义错误),但如果只需要ok/err结果就足够了。
use chrono::NaiveDate;
use nom::bytes::streaming::take;
use nom::combinator::map_res;
use nom::error::{Error, ErrorKind};
use nom::IResult;
fn parse_date(i: &str) -> IResult<&str, NaiveDate> {
map_res(take(10usize), |s| NaiveDate::parse_from_str(s, "%m/%d/%Y"))(i)
}
fn main() {
assert_eq!(
parse_date("01/31/2022: rest").unwrap(),
(": rest", NaiveDate::from_ymd(2022, 01, 31))
);
assert_eq!(
parse_date("yy/xx/2022").unwrap_err(),
nom::Err::Error(Error::new("yy/xx/2022", ErrorKind::MapRes))
);
}