diff --git a/crates/aiken-project/src/blueprint/mod.rs b/crates/aiken-project/src/blueprint/mod.rs index 6e9c2343..7652e7bd 100644 --- a/crates/aiken-project/src/blueprint/mod.rs +++ b/crates/aiken-project/src/blueprint/mod.rs @@ -53,7 +53,10 @@ impl Blueprint { } } -impl Blueprint { +impl Blueprint +where + T: Clone, +{ pub fn lookup( &self, title: Option<&String>, @@ -83,10 +86,10 @@ impl Blueprint { action: F, ) -> Result where - F: Fn(&Validator) -> Result, + F: Fn(Validator) -> Result, { match self.lookup(title, purpose) { - Some(LookupResult::One(validator)) => action(validator), + Some(LookupResult::One(validator)) => action(validator.to_owned()), Some(LookupResult::Many) => Err(when_too_many( self.validators .iter() diff --git a/crates/aiken-project/src/blueprint/validator.rs b/crates/aiken-project/src/blueprint/validator.rs index aef9a368..ea13ce18 100644 --- a/crates/aiken-project/src/blueprint/validator.rs +++ b/crates/aiken-project/src/blueprint/validator.rs @@ -122,7 +122,12 @@ impl Validator { .unwrap(), }) } +} +impl Validator +where + T: Clone, +{ pub fn apply(&mut self, arg: &Term) -> Result<(), Error> { match self.parameters.split_first() { None => Err(Error::NoParametersToApply), diff --git a/crates/aiken-project/src/lib.rs b/crates/aiken-project/src/lib.rs index 4f5e55ad..5f79b988 100644 --- a/crates/aiken-project/src/lib.rs +++ b/crates/aiken-project/src/lib.rs @@ -12,7 +12,7 @@ pub mod pretty; pub mod script; pub mod telemetry; -use crate::blueprint::{schema::Schema, validator, Blueprint, LookupResult}; +use crate::blueprint::{schema::Schema, validator, Blueprint}; use aiken_lang::{ ast::{Definition, Function, ModuleKind, TypedDataType, TypedFunction}, builder::{DataTypeKey, FunctionAccessKey}, @@ -37,7 +37,7 @@ use std::{ }; use telemetry::EventListener; use uplc::{ - ast::{Constant, Term}, + ast::{Constant, DeBruijn, Term}, machine::cost_model::ExBudget, }; @@ -306,9 +306,8 @@ where }; // Read blueprint - let filepath = self.blueprint_path(); - let blueprint = - File::open(filepath).map_err(|_| blueprint::error::Error::InvalidOrMissingFile)?; + let blueprint = File::open(self.blueprint_path()) + .map_err(|_| blueprint::error::Error::InvalidOrMissingFile)?; let blueprint: Blueprint = serde_json::from_reader(BufReader::new(blueprint))?; @@ -323,6 +322,33 @@ where }) } + pub fn apply_parameter( + &self, + title: Option<&String>, + purpose: Option<&validator::Purpose>, + param: &Term, + ) -> Result, Error> { + // Read blueprint + let blueprint = File::open(self.blueprint_path()) + .map_err(|_| blueprint::error::Error::InvalidOrMissingFile)?; + let blueprint: Blueprint = + serde_json::from_reader(BufReader::new(blueprint))?; + + // Apply parameters + let when_too_many = + |known_validators| Error::MoreThanOneValidatorFound { known_validators }; + let when_missing = |known_validators| Error::NoValidatorNotFound { known_validators }; + blueprint.with_validator( + title, + purpose, + when_too_many, + when_missing, + |mut validator| validator.apply(param).map_err(|e| e.into()), + )?; + + Ok(blueprint) + } + fn compile_deps(&mut self) -> Result<(), Error> { let manifest = deps::download( &self.event_listener,