radix_clis/rtmc/
mod.rs

1use crate::prelude::*;
2
3/// Radix transaction manifest compiler
4#[derive(Parser, Debug)]
5#[clap(author, version, about, long_about = None, name = "rtmc")]
6pub struct Args {
7    /// Path to the output file
8    #[clap(short, long)]
9    output: PathBuf,
10
11    /// Network to Use [Simulator | Alphanet | Mainnet]
12    #[clap(short, long)]
13    network: Option<String>,
14
15    /// The paths to blobs
16    #[clap(short, long, multiple = true)]
17    blobs: Option<Vec<String>>,
18
19    /// Input file
20    #[clap(required = true)]
21    input: PathBuf,
22
23    /// The manifest type [V1 | SystemV1 | V2 | SubintentV2], defaults to V2
24    #[clap(short, long)]
25    kind: Option<String>,
26}
27
28#[derive(Debug)]
29pub enum Error {
30    IoError(std::io::Error),
31    EncodeError(sbor::EncodeError),
32    ParseNetworkError(ParseNetworkError),
33    ManifestValidationError(ManifestValidationError),
34    InstructionSchemaValidationError(radix_engine::utils::LocatedInstructionSchemaValidationError),
35}
36
37impl fmt::Display for Error {
38    // TODO Implement pretty error printing
39    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
40        write!(f, "{:?}", self)
41    }
42}
43
44impl From<Error> for String {
45    fn from(err: Error) -> String {
46        err.to_string()
47    }
48}
49
50pub fn run() -> Result<(), String> {
51    let args = Args::parse();
52
53    let content = std::fs::read_to_string(&args.input).map_err(Error::IoError)?;
54    let network = match args.network {
55        Some(n) => NetworkDefinition::from_str(&n).map_err(Error::ParseNetworkError)?,
56        None => NetworkDefinition::simulator(),
57    };
58    let mut blobs = Vec::new();
59    if let Some(paths) = args.blobs {
60        for path in paths {
61            blobs.push(std::fs::read(path).map_err(Error::IoError)?);
62        }
63    }
64
65    let manifest_kind = ManifestKind::parse_or_latest(args.kind.as_deref())?;
66    let manifest = compile_any_manifest_with_pretty_error(
67        &content,
68        manifest_kind,
69        &network,
70        BlobProvider::new_with_blobs(blobs),
71        CompileErrorDiagnosticsStyle::TextTerminalColors,
72    )?;
73
74    manifest
75        .validate(ValidationRuleset::all())
76        .map_err(Error::ManifestValidationError)?;
77
78    validate_call_arguments_to_native_components(&manifest)
79        .map_err(Error::InstructionSchemaValidationError)?;
80
81    write_ensuring_folder_exists(
82        args.output,
83        manifest_encode(&manifest).map_err(Error::EncodeError)?,
84    )
85    .map_err(Error::IoError)?;
86
87    Ok(())
88}