Check a single POD against a POD Request (#359)

This commit is contained in:
Rob Knight 2025-07-30 02:46:14 +01:00 committed by GitHub
parent c7b39f21f0
commit f10a5adb41
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 419 additions and 102 deletions

View file

@ -70,7 +70,7 @@ mod tests {
let params = Params::default();
let processed = parse(input, &params, &[])?;
let batch_result = processed.custom_batch;
let request_result = processed.request_templates;
let request_result = processed.request.templates();
assert_eq!(request_result.len(), 0);
assert_eq!(batch_result.predicates.len(), 1);
@ -115,13 +115,11 @@ mod tests {
let params = Params::default();
let processed = parse(input, &params, &[])?;
let batch_result = processed.custom_batch;
let request_templates = processed.request_templates;
let request_templates = processed.request.templates();
assert_eq!(batch_result.predicates.len(), 0);
assert!(!request_templates.is_empty());
let request_templates = request_templates;
// Expected structure
let expected_templates = vec![
StatementTmpl {
@ -157,7 +155,7 @@ mod tests {
let params = Params::default();
let processed = parse(input, &params, &[])?;
let batch_result = processed.custom_batch;
let request_result = processed.request_templates;
let request_result = processed.request.templates();
assert_eq!(request_result.len(), 0);
assert_eq!(batch_result.predicates.len(), 1);
@ -214,13 +212,12 @@ mod tests {
let params = Params::default();
let processed = parse(input, &params, &[])?;
let batch_result = processed.custom_batch;
let request_templates = processed.request_templates;
let request_templates = processed.request.templates();
assert_eq!(batch_result.predicates.len(), 1);
assert!(!request_templates.is_empty());
let batch = batch_result;
let request_templates = request_templates;
// Expected Batch structure
let expected_pred_statements = vec![StatementTmpl {
@ -278,13 +275,11 @@ mod tests {
let params = Params::default();
let processed = parse(input, &params, &[])?;
let batch_result = processed.custom_batch;
let request_templates = processed.request_templates;
let request_templates = processed.request.templates();
assert_eq!(batch_result.predicates.len(), 1); // some_pred is defined
assert!(!request_templates.is_empty());
let request_templates = request_templates;
// Expected Wildcard Indices in Request Scope:
// ?Var1 -> 0
// ?AnotherPod -> 1
@ -330,13 +325,11 @@ mod tests {
let params = Params::default();
let processed = parse(input, &params, &[])?;
let batch_result = processed.custom_batch;
let request_templates = processed.request_templates;
let request_templates = processed.request.templates();
assert_eq!(batch_result.predicates.len(), 0);
assert!(!request_templates.is_empty());
let request_templates = request_templates;
let expected_templates = vec![
StatementTmpl {
pred: Predicate::Native(NativePredicate::LtEq),
@ -389,7 +382,7 @@ mod tests {
// Parse the input string
let processed = super::parse(input, &Params::default(), &[])?;
let parsed_templates = processed.request_templates;
let parsed_templates = processed.request.templates();
// Define Expected Templates (Copied from prover/mod.rs)
let now_minus_18y_val = Value::from(1169909388_i64);
@ -529,7 +522,7 @@ mod tests {
let processed = super::parse(input, &params, &[])?;
assert!(
processed.request_templates.is_empty(),
processed.request.templates().is_empty(),
"Expected no request templates"
);
assert_eq!(
@ -719,7 +712,7 @@ mod tests {
// 3. Parse the input
let processed = parse(&input, &params, &available_batches)?;
let request_templates = processed.request_templates;
let request_templates = processed.request.templates();
assert!(
processed.custom_batch.predicates.is_empty(),
@ -771,7 +764,7 @@ mod tests {
// 3. Parse the input
let processed = parse(&input, &params, &available_batches)?;
let request_templates = processed.request_templates;
let request_templates = processed.request.templates();
assert_eq!(request_templates.len(), 2, "Expected two request templates");
@ -830,7 +823,7 @@ mod tests {
let processed = parse(&input, &params, &available_batches)?;
assert!(
processed.request_templates.is_empty(),
processed.request.templates().is_empty(),
"No request should be defined"
);
assert_eq!(
@ -903,7 +896,7 @@ mod tests {
let params = Params::default();
let processed = parse(&input, &params, &[])?;
let request_templates = processed.request_templates;
let request_templates = processed.request.templates();
let expected_templates = vec![
StatementTmpl {

View file

@ -2,8 +2,11 @@
use std::fmt::Write;
use crate::middleware::{
CustomPredicate, CustomPredicateBatch, Predicate, StatementTmpl, StatementTmplArg, Value,
use crate::{
frontend::PodRequest,
middleware::{
CustomPredicate, CustomPredicateBatch, Predicate, StatementTmpl, StatementTmplArg, Value,
},
};
/// Trait for converting AST nodes to Podlang source code
@ -122,6 +125,19 @@ impl PrettyPrint for Value {
}
}
impl PrettyPrint for PodRequest {
fn fmt_podlang_with_indent(&self, w: &mut dyn Write, _indent: usize) -> std::fmt::Result {
write!(w, "REQUEST(")?;
for (i, template) in self.request_templates.iter().enumerate() {
if i > 0 {
write!(w, ", ")?;
}
template.fmt_podlang_with_indent(w, 4)?;
}
write!(w, ")")
}
}
fn fmt_predicate_definition(
w: &mut dyn Write,
predicate: &CustomPredicate,

View file

@ -12,8 +12,8 @@ use crate::{
deserialize_bytes,
primitives::ec::{curve::Point, schnorr::SecretKey},
},
frontend::{BuilderArg, CustomPredicateBatchBuilder, StatementTmplBuilder},
lang::Rule,
frontend::{BuilderArg, CustomPredicateBatchBuilder, PodRequest, StatementTmplBuilder},
lang::parser::Rule,
middleware::{
self, CustomPredicateBatch, CustomPredicateRef, Key, NativePredicate, Params, Predicate,
StatementTmpl, StatementTmplArg, Value, Wildcard, F, VALUE_SIZE,
@ -57,7 +57,7 @@ pub fn native_predicate_from_string(s: &str) -> Option<NativePredicate> {
#[derive(Debug, Clone, PartialEq)]
pub struct PodlangOutput {
pub custom_batch: Arc<CustomPredicateBatch>,
pub request_templates: Vec<StatementTmpl>,
pub request: PodRequest,
}
struct ProcessingContext<'a> {
@ -295,7 +295,7 @@ fn second_pass(
Ok(PodlangOutput {
custom_batch,
request_templates,
request: PodRequest::new(request_templates),
})
}