在nom中解析一定大小的数字
Parse a number of a certain size in nom
我可以很好地解析这样的数字:
map_res(digit1, |s: &str| s.parse::<u16>())
但是只有在一定范围内才能解析数字?
您可以检查解析的数字是否在范围内,return如果不符合则报错:
map_res(digit1, |s: &str| {
// uses std::io::Error for brevity, you'd define your own error
match s.parse::<u16>() {
Ok(n) if n < MIN || n > MAX => Err(io::Error::new(io::ErrorKind::Other, "out of range")),
Ok(n) => Ok(n),
Err(e) => Err(io::Error::new(io::ErrorKind::Other, e.to_string())),
}
})
匹配也可以用and_then
和map_err
组合子表示:
map_res(digit1, |s: &str| {
s.parse::<u16>()
.map_err(|e| io::Error::new(io::ErrorKind::Other, e.to_string()))
.and_then(|n| {
if n < MIN || n > MAX {
Err(io::Error::new(io::ErrorKind::Other, "out of range"))
} else {
Ok(n)
}
})
})
我可以很好地解析这样的数字:
map_res(digit1, |s: &str| s.parse::<u16>())
但是只有在一定范围内才能解析数字?
您可以检查解析的数字是否在范围内,return如果不符合则报错:
map_res(digit1, |s: &str| {
// uses std::io::Error for brevity, you'd define your own error
match s.parse::<u16>() {
Ok(n) if n < MIN || n > MAX => Err(io::Error::new(io::ErrorKind::Other, "out of range")),
Ok(n) => Ok(n),
Err(e) => Err(io::Error::new(io::ErrorKind::Other, e.to_string())),
}
})
匹配也可以用and_then
和map_err
组合子表示:
map_res(digit1, |s: &str| {
s.parse::<u16>()
.map_err(|e| io::Error::new(io::ErrorKind::Other, e.to_string()))
.and_then(|n| {
if n < MIN || n > MAX {
Err(io::Error::new(io::ErrorKind::Other, "out of range"))
} else {
Ok(n)
}
})
})