From 12f476800868dc0587073b77e25fc46178d48cd5 Mon Sep 17 00:00:00 2001 From: KtorZ Date: Sat, 4 Feb 2023 10:22:23 +0100 Subject: [PATCH] Write method to apply a UPLC term to an existing 'Validator' --- crates/aiken-project/src/blueprint/error.rs | 6 ++++++ crates/aiken-project/src/blueprint/validator.rs | 14 +++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/crates/aiken-project/src/blueprint/error.rs b/crates/aiken-project/src/blueprint/error.rs index f9acdb29..a7f93555 100644 --- a/crates/aiken-project/src/blueprint/error.rs +++ b/crates/aiken-project/src/blueprint/error.rs @@ -27,6 +27,7 @@ pub enum Error { source_code: NamedSource, return_type: Arc, }, + #[error("A {} validator requires at least {} arguments.", name.purple().bold(), at_least.to_string().purple().bold())] #[diagnostic(code("aiken::blueprint::invalid::arity"))] WrongValidatorArity { @@ -37,6 +38,7 @@ pub enum Error { #[source_code] source_code: NamedSource, }, + #[error("{}", error)] #[diagnostic(help("{}", error.help()))] #[diagnostic(code("aiken::blueprint::interface"))] @@ -52,6 +54,10 @@ pub enum Error { #[diagnostic(code("aiken::blueprint::missing"))] #[diagnostic(help("Did you forget to {build} the project?", build = "build".purple().bold()))] InvalidOrMissingFile, + + #[error("I didn't find any parameters to apply in the given validator.")] + #[diagnostic(code("aiken::blueprint::apply::no_parameters"))] + NoParametersToApply, } pub fn assert_return_bool(module: &CheckedModule, def: &TypedFunction) -> Result<(), Error> { diff --git a/crates/aiken-project/src/blueprint/validator.rs b/crates/aiken-project/src/blueprint/validator.rs index faf7b229..aef9a368 100644 --- a/crates/aiken-project/src/blueprint/validator.rs +++ b/crates/aiken-project/src/blueprint/validator.rs @@ -10,7 +10,7 @@ use std::{ collections::HashMap, fmt::{self, Display}, }; -use uplc::ast::{DeBruijn, Program}; +use uplc::ast::{DeBruijn, Program, Term}; #[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize)] pub struct Validator { @@ -122,6 +122,18 @@ impl Validator { .unwrap(), }) } + + pub fn apply(&mut self, arg: &Term) -> Result<(), Error> { + match self.parameters.split_first() { + None => Err(Error::NoParametersToApply), + Some((_, tail)) => { + // TODO: Ideally, we should control that the applied term matches its schema. + self.program = self.program.apply_term(arg); + self.parameters = tail.to_vec(); + Ok(()) + } + } + } } impl Purpose {