start on refactoring validator to support multi-validators in blueprint

This commit is contained in:
Kasey White 2023-03-17 10:39:26 -04:00 committed by rvcas
parent 61113cd7b9
commit fe92b27d50
No known key found for this signature in database
GPG Key ID: C09B64E263F7D68C
2 changed files with 35 additions and 12 deletions

View File

@ -60,7 +60,7 @@ impl Blueprint<Reference, Annotated<Schema>> {
let validators: Result<Vec<_>, Error> = modules let validators: Result<Vec<_>, Error> = modules
.validators() .validators()
.map(|(validator, def)| { .flat_map(|(validator, def)| {
Validator::from_checked_module(modules, generator, validator, def).map( Validator::from_checked_module(modules, generator, validator, def).map(
|mut schema| { |mut schema| {
definitions.merge(&mut schema.definitions); definitions.merge(&mut schema.definitions);

View File

@ -4,10 +4,13 @@ use super::{
schema::{Annotated, Schema}, schema::{Annotated, Schema},
}; };
use crate::module::{CheckedModule, CheckedModules}; use crate::module::{CheckedModule, CheckedModules};
use aiken_lang::{ast::TypedValidator, uplc::CodeGenerator}; use aiken_lang::{
ast::{TypedArg, TypedFunction, TypedValidator},
uplc::CodeGenerator,
};
use miette::NamedSource; use miette::NamedSource;
use serde; use serde;
use uplc::ast::{DeBruijn, Program, Term}; use uplc::ast::{DeBruijn, Name, Program, Term};
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize)] #[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize)]
pub struct Validator<R, S> { pub struct Validator<R, S> {
@ -47,19 +50,39 @@ impl Validator<Reference, Annotated<Schema>> {
generator: &mut CodeGenerator, generator: &mut CodeGenerator,
module: &CheckedModule, module: &CheckedModule,
def: &TypedValidator, def: &TypedValidator,
) -> Result<Validator<Reference, Annotated<Schema>>, Error> { ) -> Vec<Result<Validator<Reference, Annotated<Schema>>, Error>> {
let mut args = def.fun.arguments.iter().rev(); let program: Program<Name> = generator.generate(def).try_into().unwrap();
let (_, redeemer, datum) = (args.next(), args.next().unwrap(), args.next());
let mut arguments = Vec::with_capacity(def.params.len() + def.fun.arguments.len());
arguments.extend(def.params.clone());
arguments.extend(def.fun.arguments.clone());
let mut definitions = Definitions::new(); let mut definitions = Definitions::new();
let mut validators = vec![Validator::create_validator_blueprint(
modules, def.params, def.fun,
)];
if let Some(other_func) = def.other_fun {
todo!()
} else {
todo!()
}
validators
}
fn create_validator_blueprint(
modules: &CheckedModules,
params: Vec<TypedArg>,
func: TypedFunction,
) -> Result<Validator<Reference, Annotated<Schema>>, Error> {
let mut args = func.arguments.iter().rev();
let (_, redeemer, datum) = (args.next(), args.next().unwrap(), args.next());
let mut arguments = Vec::with_capacity(params.len() + func.arguments.len());
arguments.extend(params.clone());
arguments.extend(func.arguments.clone());
Ok(Validator { Ok(Validator {
title: format!("{}.{}", &module.name, &def.fun.name), title: format!("{}.{}", &module.name, &func.name),
description: None, description: None,
parameters: def parameters: def
.params .params