use proc_macro2::TokenStream;
pub mod sigma {
pub mod codegen;
pub mod combiners;
pub mod types;
}
mod codegen;
mod notequals;
mod pedersen;
mod pubscalareq;
mod rangeproof;
mod substitution;
mod syntax;
mod transform;
pub use codegen::CodeGen;
pub use syntax::{SigmaCompSpec, TaggedIdent, TaggedPoint, TaggedScalar, TaggedVarDict};
use syn::Result;
pub fn enforce_disjunction_invariant(
codegen: &mut CodeGen,
spec: &mut SigmaCompSpec,
) -> Result<()> {
transform::enforce_disjunction_invariant(codegen, &mut spec.statements, &mut spec.vars)
}
pub fn apply_transformations(codegen: &mut CodeGen, spec: &mut SigmaCompSpec) -> Result<()> {
substitution::transform(codegen, &mut spec.statements, &mut spec.vars)?;
rangeproof::transform(codegen, &mut spec.statements, &mut spec.vars)?;
notequals::transform(codegen, &mut spec.statements, &mut spec.vars)?;
pubscalareq::transform(codegen, &mut spec.statements, &mut spec.vars)?;
Ok(())
}
pub fn sigma_compiler_core(
spec: &mut SigmaCompSpec,
emit_prover: bool,
emit_verifier: bool,
) -> TokenStream {
let mut codegen = codegen::CodeGen::new(spec);
enforce_disjunction_invariant(&mut codegen, spec).unwrap();
apply_transformations(&mut codegen, spec).unwrap();
codegen.generate(spec, emit_prover, emit_verifier)
}