feat(snix/eval): proper error handling for invalid regexes

We don't want to crash the evaluator when an invalid regex is passed,
but instead display a user-facing error message. This CL does that.

Change-Id: I81fd8e342fc877344f8d2a3704ef53caf5190aa3
Reviewed-on: https://cl.snix.dev/c/snix/+/30588
Reviewed-by: Vova Kryachko <v.kryachko@gmail.com>
Tested-by: besadii
Reviewed-by: Bence Nemes <nemes.bence1@gmail.com>
This commit is contained in:
Florian Klink 2025-06-29 21:17:39 +03:00
parent 4de1129acb
commit 3c1a7176cb
3 changed files with 12 additions and 3 deletions

View file

@ -991,8 +991,9 @@ mod pure_builtins {
return Ok(re);
}
let re = re.to_str()?;
let re: Regex =
cached_regex(&format!("^{}$", re.to_str()?)).expect("TODO(tazjin): propagate error");
let re = re.to_str()?;
let re: Regex = cached_regex(&format!("^{}$", re))
.map_err(|_| ErrorKind::InvalidRegex(re.to_string()))?;
match re.captures(s.to_str()?) {
Some(caps) => Ok(Value::List(
@ -1213,7 +1214,8 @@ mod pure_builtins {
let s = str.to_contextful_str()?;
let text = s.to_str()?;
let re = regex.to_str()?;
let re = cached_regex(re.to_str()?).unwrap();
let re = re.to_str()?;
let re = cached_regex(re).map_err(|_| ErrorKind::InvalidRegex(re.to_string()))?;
let mut capture_locations = re.capture_locations();
let num_captures = capture_locations.len();
let mut ret = Vec::new();

View file

@ -294,6 +294,10 @@ to a missing value in the attribute set(s) included via `with`."#
/// or "sha512"
#[error("unknown hash type '{0}'")]
UnknownHashType(String),
/// An invalid regular expression was passed.
#[error("invalid regular expression '{0}'")]
InvalidRegex(String),
}
impl error::Error for Error {
@ -688,6 +692,7 @@ impl Error {
| ErrorKind::WithContext { .. }
| ErrorKind::UnknownHashType(_)
| ErrorKind::InvalidHash(_)
| ErrorKind::InvalidRegex(_)
| ErrorKind::CatchableError(_) => return None,
};
@ -735,6 +740,7 @@ impl Error {
ErrorKind::UnknownHashType(_) => "E039",
ErrorKind::UnexpectedArgumentBuiltin { .. } => "E040",
ErrorKind::InvalidHash(_) => "E041",
ErrorKind::InvalidRegex(_) => "E042",
// Special error code for errors from other Snix
// components. We may want to introduce a code namespacing

View file

@ -0,0 +1 @@
builtins.match "a(b))c" "abc"