1use crate::prelude::*;
2
3#[derive(Parser, Debug)]
5#[clap(author, version, about, long_about = None, name = "rtmc")]
6pub struct Args {
7 #[clap(short, long)]
9 output: PathBuf,
10
11 #[clap(short, long)]
13 network: Option<String>,
14
15 #[clap(short, long, multiple = true)]
17 blobs: Option<Vec<String>>,
18
19 #[clap(required = true)]
21 input: PathBuf,
22
23 #[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 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}