feat: implement convert command
This commit is contained in:
parent
812ffb30f0
commit
e2dc4ec6c8
|
@ -41,3 +41,7 @@ pub enum Error {
|
||||||
keyword_spend = "spend".if_supports_color(Stdout, |s| s.purple())))]
|
keyword_spend = "spend".if_supports_color(Stdout, |s| s.purple())))]
|
||||||
ParameterizedValidator { n: usize },
|
ParameterizedValidator { n: usize },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe impl Send for Error {}
|
||||||
|
|
||||||
|
unsafe impl Sync for Error {}
|
||||||
|
|
|
@ -1,4 +1,12 @@
|
||||||
use std::path::PathBuf;
|
use clap::clap_derive::ArgEnum;
|
||||||
|
use miette::IntoDiagnostic;
|
||||||
|
use serde_json::json;
|
||||||
|
use std::{env, fs::File, io::BufReader, path::PathBuf, process};
|
||||||
|
|
||||||
|
use aiken_project::{
|
||||||
|
blueprint::{error::Error as BlueprintError, Blueprint},
|
||||||
|
error::Error as ProjectError,
|
||||||
|
};
|
||||||
|
|
||||||
/// Convert a blueprint into other formats.
|
/// Convert a blueprint into other formats.
|
||||||
#[derive(clap::Args)]
|
#[derive(clap::Args)]
|
||||||
|
@ -14,6 +22,15 @@ pub struct Args {
|
||||||
/// Name of the validator within the module. Optional if there's only one validator.
|
/// Name of the validator within the module. Optional if there's only one validator.
|
||||||
#[clap(short, long)]
|
#[clap(short, long)]
|
||||||
validator: Option<String>,
|
validator: Option<String>,
|
||||||
|
|
||||||
|
// Format to convert to
|
||||||
|
#[clap(long, arg_enum, default_value = "cardano-cli")]
|
||||||
|
to: Format,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, ArgEnum)]
|
||||||
|
pub enum Format {
|
||||||
|
CardanoCli,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn exec(
|
pub fn exec(
|
||||||
|
@ -21,7 +38,75 @@ pub fn exec(
|
||||||
directory,
|
directory,
|
||||||
module,
|
module,
|
||||||
validator,
|
validator,
|
||||||
|
to,
|
||||||
}: Args,
|
}: Args,
|
||||||
) -> miette::Result<()> {
|
) -> miette::Result<()> {
|
||||||
Ok(())
|
let title = module.as_ref().map(|m| {
|
||||||
|
format!(
|
||||||
|
"{m}{}",
|
||||||
|
validator
|
||||||
|
.as_ref()
|
||||||
|
.map(|v| format!(".{v}"))
|
||||||
|
.unwrap_or_default()
|
||||||
|
)
|
||||||
|
});
|
||||||
|
|
||||||
|
let title = title.as_ref().or(validator.as_ref());
|
||||||
|
|
||||||
|
let project_path = if let Some(d) = directory {
|
||||||
|
d
|
||||||
|
} else {
|
||||||
|
env::current_dir().into_diagnostic()?
|
||||||
|
};
|
||||||
|
|
||||||
|
let blueprint_path = project_path.join("plutus.json");
|
||||||
|
|
||||||
|
// Read blueprint
|
||||||
|
let blueprint = File::open(blueprint_path)
|
||||||
|
.map_err(|_| BlueprintError::InvalidOrMissingFile)
|
||||||
|
.into_diagnostic()?;
|
||||||
|
|
||||||
|
let blueprint: Blueprint<serde_json::Value> =
|
||||||
|
serde_json::from_reader(BufReader::new(blueprint)).into_diagnostic()?;
|
||||||
|
|
||||||
|
// Calculate the address
|
||||||
|
let when_too_many =
|
||||||
|
|known_validators| ProjectError::MoreThanOneValidatorFound { known_validators };
|
||||||
|
let when_missing = |known_validators| ProjectError::NoValidatorNotFound { known_validators };
|
||||||
|
|
||||||
|
let result =
|
||||||
|
blueprint.with_validator(title, when_too_many, when_missing, |validator| match to {
|
||||||
|
Format::CardanoCli => {
|
||||||
|
let cbor_bytes = validator.program.to_cbor().unwrap();
|
||||||
|
|
||||||
|
let mut double_cbor_bytes = Vec::new();
|
||||||
|
|
||||||
|
let mut cbor_encoder = pallas_codec::minicbor::Encoder::new(&mut double_cbor_bytes);
|
||||||
|
|
||||||
|
cbor_encoder.bytes(&cbor_bytes).unwrap();
|
||||||
|
|
||||||
|
let cbor_hex = hex::encode(double_cbor_bytes);
|
||||||
|
|
||||||
|
Ok(json!({
|
||||||
|
"type": "PlutusScriptV2",
|
||||||
|
"description": "Generated by Aiken",
|
||||||
|
"cborHex": cbor_hex
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
match result {
|
||||||
|
Ok(value) => {
|
||||||
|
let json = serde_json::to_string_pretty(&value).unwrap();
|
||||||
|
|
||||||
|
println!("{json}");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
err.report();
|
||||||
|
|
||||||
|
process::exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue