cidr map: improve error message for bad ip address syntax

We now generate more context-rich error messages to help pinpoint
the problem:

```
caused by: failed to parse '10.0.0.1/24' as CIDR notation: host part of address was not zero
```
This commit is contained in:
Wez Furlong
2023-08-10 18:05:16 -07:00
parent 7d450fdb41
commit af59a33650
+17 -7
View File
@@ -539,7 +539,7 @@ impl LuaUserData for CidrMap<CacheValue> {
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) {
mod_memoize::Memoized::impl_memoize(methods);
methods.add_meta_method(MetaMethod::Index, |lua, this, key: String| {
let key = parse_cidr_from_ip_and_or_port(&key)?;
let key = parse_cidr_from_ip_and_or_port(&key).map_err(any_err)?;
if let Some(value) = this.get_prefix_match_cidr(&key) {
let value = value.as_lua(lua)?;
Ok(Some(value))
@@ -550,7 +550,7 @@ impl LuaUserData for CidrMap<CacheValue> {
methods.add_meta_method_mut(
MetaMethod::NewIndex,
|lua, this, (key, value): (String, mlua::Value)| {
let key = parse_cidr_from_ip_and_or_port(&key)?;
let key = parse_cidr_from_ip_and_or_port(&key).map_err(any_err)?;
let value = CacheValue::from_lua(value, lua)?;
this.insert(key, value);
Ok(())
@@ -559,19 +559,29 @@ impl LuaUserData for CidrMap<CacheValue> {
}
}
fn parse_cidr_from_ip_and_or_port(s: &str) -> mlua::Result<AnyIpCidr> {
fn parse_cidr_from_ip_and_or_port(s: &str) -> anyhow::Result<AnyIpCidr> {
match AnyIpCidr::from_str(s) {
Ok(c) => Ok(c),
Err(err) => {
if s.starts_with('[') {
if let Some((ip, _port)) = s[1..].split_once(']') {
return AnyIpCidr::from_str(ip).map_err(any_err);
return AnyIpCidr::from_str(ip).map_err(|err| {
anyhow::anyhow!(
"failed to parse '{ip}', the \
[]-enclosed portion of '{s}', as an IP address: {err:#}"
)
});
}
}
if let Some((ip, _port)) = s.rsplit_once(':') {
return AnyIpCidr::from_str(ip).map_err(any_err);
return AnyIpCidr::from_str(ip).map_err(|err| {
anyhow::anyhow!(
"failed to parse '{ip}', the \
:-delimited portion of '{s}', as an IP address: {err:#}"
)
});
}
Err(err).map_err(any_err)
anyhow::bail!("failed to parse '{s}' as CIDR notation: {err:#}");
}
}
}
@@ -586,7 +596,7 @@ pub fn register(lua: &Lua) -> anyhow::Result<()> {
if let Some(value) = value {
for (k, v) in value {
let k = parse_cidr_from_ip_and_or_port(&k)?;
let k = parse_cidr_from_ip_and_or_port(&k).map_err(any_err)?;
let v = CacheValue::from_lua(v, lua)?;
cmap.insert(k, v);
}