use anyhow::{Context, Result};
use snarkvm::prelude::{Program, ProgramID, TestnetV0};
use std::str::FromStr;
#[derive(Clone, Debug)]
pub struct AleoProgram {
pub(crate) program: Program<TestnetV0>,
}
impl AleoProgram {
pub fn from_local_file(path: &str) -> Result<Self> {
let source = std::fs::read_to_string(path).context(format!("Failed to read {path}"))?;
let program = Program::<TestnetV0>::from_str(&source).context("Failed to parse program")?;
Ok(Self { program })
}
pub fn from_source(source: &str) -> Result<Self> {
let program = Program::<TestnetV0>::from_str(source).context("Failed to parse program")?;
Ok(Self { program })
}
pub fn credits() -> Result<Self> {
let program = Program::<TestnetV0>::credits()?;
Ok(Self { program })
}
pub fn id(&self) -> &ProgramID<TestnetV0> {
self.program.id()
}
pub fn inner(&self) -> &Program<TestnetV0> {
&self.program
}
pub fn into_inner(self) -> Program<TestnetV0> {
self.program
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_credits_program() {
let prog = AleoProgram::credits().unwrap();
assert!(prog.id().to_string().contains("credits.aleo"));
}
#[test]
fn test_parse_simple_program() {
let source = r#"
program hello.aleo;
function main:
input r0 as u32.public;
output r0 as u32.public;
"#;
let prog = AleoProgram::from_source(source).unwrap();
assert_eq!(prog.id().to_string(), "hello.aleo");
}
}