From 8ed930ac5a1cbcfd2e1ece1dd9a372c00c3208b1 Mon Sep 17 00:00:00 2001 From: rvcas Date: Wed, 3 Apr 2024 19:16:15 -0400 Subject: [PATCH] feat: implement Export object based on blueprint Co-authored-by: Kasey White --- crates/aiken-project/src/export.rs | 62 ++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/crates/aiken-project/src/export.rs b/crates/aiken-project/src/export.rs index d920f876..e40e94eb 100644 --- a/crates/aiken-project/src/export.rs +++ b/crates/aiken-project/src/export.rs @@ -1,9 +1,15 @@ +use aiken_lang::{ast::TypedFunction, gen_uplc::CodeGenerator}; +use miette::NamedSource; use uplc::ast::{DeBruijn, Program}; -use crate::blueprint::{ - definitions::Definitions, - parameter::Parameter, - schema::{Annotated, Schema}, +use crate::{ + blueprint::{ + self, + definitions::Definitions, + parameter::Parameter, + schema::{Annotated, Schema}, + }, + module::{CheckedModule, CheckedModules}, }; #[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize)] @@ -24,3 +30,51 @@ pub struct Export { #[serde(default)] pub definitions: Definitions>, } + +impl Export { + pub fn from_function( + func: &TypedFunction, + module: &CheckedModule, + generator: &mut CodeGenerator, + modules: &CheckedModules, + ) -> Result { + let program = generator + .generate_raw(&func.body, &func.arguments, &module.name) + .to_debruijn() + .unwrap(); + + let mut definitions = Definitions::new(); + + let parameters = func + .arguments + .iter() + .map(|param| { + Annotated::from_type( + modules.into(), + blueprint::validator::tipo_or_annotation(module, param), + &mut definitions, + ) + .map(|schema| Parameter { + title: Some(param.arg_name.get_label()), + schema, + }) + .map_err(|error| blueprint::Error::Schema { + error, + location: param.location, + source_code: NamedSource::new( + module.input_path.display().to_string(), + module.code.clone(), + ), + }) + }) + .collect::>()?; + + Ok(Export { + name: format!("{}.{}", &module.name, &func.name), + doc: func.doc.clone(), + parameters, + program, + definitions, + }) + } +}