chore: minor error handling improvements (#325)

* Minor error handling improvements

* Fix error
This commit is contained in:
Ahmad Afuni 2025-07-05 20:06:44 +10:00 committed by GitHub
parent 901ba6442c
commit 2c41a6c554
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 62 additions and 58 deletions

View file

@ -178,23 +178,25 @@ impl CustomPredicateBatchBuilder {
let args = stb
.args
.iter()
.map(|a| match a {
BuilderArg::Literal(v) => StatementTmplArg::Literal(v.clone()),
BuilderArg::Key(pod_id_wc, key_str) => StatementTmplArg::AnchoredKey(
resolve_wildcard(args, priv_args, pod_id_wc),
Key::from(key_str),
),
BuilderArg::WildcardLiteral(v) => {
StatementTmplArg::Wildcard(resolve_wildcard(args, priv_args, v))
}
.map(|a| {
Ok::<_, Error>(match a {
BuilderArg::Literal(v) => StatementTmplArg::Literal(v.clone()),
BuilderArg::Key(pod_id_wc, key_str) => StatementTmplArg::AnchoredKey(
resolve_wildcard(args, priv_args, pod_id_wc)?,
Key::from(key_str),
),
BuilderArg::WildcardLiteral(v) => {
StatementTmplArg::Wildcard(resolve_wildcard(args, priv_args, v)?)
}
})
})
.collect();
StatementTmpl {
.collect::<Result<_>>()?;
Ok(StatementTmpl {
pred: stb.predicate.clone(),
args,
}
})
})
.collect();
.collect::<Result<_>>()?;
let custom_predicate = CustomPredicate::new(
&self.params,
name.into(),
@ -215,12 +217,16 @@ impl CustomPredicateBatchBuilder {
}
}
fn resolve_wildcard(args: &[&str], priv_args: &[&str], s: &str) -> Wildcard {
fn resolve_wildcard(args: &[&str], priv_args: &[&str], s: &str) -> Result<Wildcard> {
args.iter()
.chain(priv_args.iter())
.enumerate()
.find_map(|(i, name)| (s == *name).then_some(Wildcard::new(s.to_string(), i)))
.unwrap()
.ok_or(Error::custom(format!(
"Wildcard {} not amongst args {:?}",
s,
[args.to_vec(), priv_args.to_vec()].concat()
)))
}
#[cfg(test)]

View file

@ -200,45 +200,44 @@ impl MainPodBuilder {
/// - {Dict,Array,Set}Contains/NotContains becomes Contains/NotContains.
/// - GtEqFromEntries/GtFromEntries/GtToNotEqual becomes
/// LtEqFromEntries/LtFromEntries/LtToNotEqual.
fn lower_op(op: Operation) -> Operation {
fn lower_op(op: Operation) -> Result<Operation> {
use NativeOperation::*;
use OperationType::*;
let op_type = op.0.clone();
match op.0 {
Native(DictContainsFromEntries) => {
let [dict, key, value] = op.1.try_into().unwrap(); // TODO: Error handling
Native(DictContainsFromEntries) => <[_; 3]>::try_from(op.1).map(|[dict, key, value]| {
Operation(Native(ContainsFromEntries), vec![dict, key, value], op.2)
}
Native(DictNotContainsFromEntries) => {
let [dict, key] = op.1.try_into().unwrap(); // TODO: Error handling
}),
Native(DictNotContainsFromEntries) => <[_; 2]>::try_from(op.1).map(|[dict, key]| {
Operation(Native(NotContainsFromEntries), vec![dict, key], op.2)
}
Native(SetContainsFromEntries) => {
let [set, value] = op.1.try_into().unwrap(); // TODO: Error handling
}),
Native(SetContainsFromEntries) => <[_; 2]>::try_from(op.1).map(|[set, value]| {
Operation(
Native(ContainsFromEntries),
vec![set, value.clone(), value],
op.2,
)
}
Native(SetNotContainsFromEntries) => {
let [set, value] = op.1.try_into().unwrap(); // TODO: Error handling
}),
Native(SetNotContainsFromEntries) => <[_; 2]>::try_from(op.1).map(|[set, value]| {
Operation(Native(NotContainsFromEntries), vec![set, value], op.2)
}
}),
Native(ArrayContainsFromEntries) => {
let [array, index, value] = op.1.try_into().unwrap(); // TODO: Error handling
Operation(Native(ContainsFromEntries), vec![array, index, value], op.2)
<[_; 3]>::try_from(op.1).map(|[array, index, value]| {
Operation(Native(ContainsFromEntries), vec![array, index, value], op.2)
})
}
Native(GtEqFromEntries) => {
let [entry1, entry2] = op.1.try_into().unwrap(); // TODO: Error handling
Native(GtEqFromEntries) => <[_; 2]>::try_from(op.1).map(|[entry1, entry2]| {
Operation(Native(LtEqFromEntries), vec![entry2, entry1], op.2)
}
Native(GtFromEntries) => {
let [entry1, entry2] = op.1.try_into().unwrap(); // TODO: Error handling
}),
Native(GtFromEntries) => <[_; 2]>::try_from(op.1).map(|[entry1, entry2]| {
Operation(Native(LtFromEntries), vec![entry2, entry1], op.2)
}
Native(GtToNotEqual) => Operation(Native(LtToNotEqual), op.1, op.2),
_ => op,
}),
Native(GtToNotEqual) => Ok(Operation(Native(LtToNotEqual), op.1, op.2)),
_ => Ok(op),
}
.map_err(|_| {
Error::op_invalid_args(format!("Invalid arg count in operation {:?}", op_type))
})
}
/// Fills in auxiliary data if necessary/possible.
@ -494,7 +493,7 @@ impl MainPodBuilder {
}
fn op(&mut self, public: bool, op: Operation) -> Result<Statement> {
let op = Self::fill_in_aux(Self::lower_op(op))?;
let op = Self::fill_in_aux(Self::lower_op(op)?)?;
let st = self.op_statement(op.clone())?;
self.insert(public, (st, op));