diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index e490bccc..fd4bb5e8 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -11,5 +11,9 @@ fn main() -> anyhow::Result<()> { println!("{:#?}", program); + println!("{:?}", program.flat()?); + + println!("{}", program.flat_hex()?); + Ok(()) } diff --git a/crates/uplc/example/plutus-core b/crates/uplc/example/plutus-core index e91bf68f..f060918b 100644 --- a/crates/uplc/example/plutus-core +++ b/crates/uplc/example/plutus-core @@ -1,3 +1,3 @@ (program 1.0.0 - [[(builtin addInteger) (con integer 4)] (con integer 8)] + (con bool False) ) \ No newline at end of file diff --git a/crates/uplc/src/ast.rs b/crates/uplc/src/ast.rs index 33a44e1b..5dc99bbc 100644 --- a/crates/uplc/src/ast.rs +++ b/crates/uplc/src/ast.rs @@ -1,3 +1,4 @@ +use anyhow::anyhow; use flat::en::{Encode, Encoder}; use crate::builtins::DefaultFunction; @@ -5,12 +6,28 @@ use crate::builtins::DefaultFunction; const TERM_TAG_WIDTH: u32 = 4; const CONST_TAG_WIDTH: u32 = 4; -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Program { pub version: String, pub term: Term, } +impl Program { + pub fn flat(&self) -> anyhow::Result> { + let bytes = flat::encode(self.clone()).map_err(|err| anyhow!("{}", err))?; + + Ok(bytes) + } + + pub fn flat_hex(&self) -> anyhow::Result { + let bytes = self.flat()?; + + let hex = hex::encode(&bytes); + + Ok(hex) + } +} + #[derive(Debug, Clone)] pub enum Term { // tag: 0