use marlowe_lang::parsing::{
deserialization::deserialize,
serialization::serialize,
Rule, MarloweParser
};
use clap::{
ArgEnum,
Subcommand,
Parser as ClapParser
};
use pest::Parser;
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ArgEnum)]
enum InputType {
File,
String
}
#[derive(Subcommand)]
enum MyCommands {
FromFile {path: String} ,
FromStandardInput { contract: String }
}
#[derive(ClapParser)]
#[clap(author, version, about, long_about = None)]
#[clap(propagate_version = true)]
struct Args {
#[clap(subcommand)]
command: MyCommands,
#[clap(short = 'r')]
raw: bool,
}
fn main() {
let args = Args::parse();
let serialized_input =
match args.command {
MyCommands::FromFile { path } => {
read_from_file(path)
},
MyCommands::FromStandardInput { contract} => {
contract
}
};
match args.raw {
true => {
let tokens =
MarloweParser::parse(
Rule::Contract,
&serialized_input,
);
let t = tokens.unwrap();
let json = serde_json::to_string_pretty(&t).unwrap();
println!("{}",json);
},
_ => {
let deserialized_instance = deserialize(&serialized_input);
match deserialized_instance {
Ok(c) => {
let serialized = serialize(c);
println!("{serialized}");
},
Err(e) => println!("{:#}",e),
}
}
}
}
fn read_from_file(path:String) -> String {
let path_exists = std::path::Path::new(&path).exists();
if path_exists {
std::fs::read_to_string(&path).expect("failed to read from file.").to_owned()
} else {
panic!("no such file exists.");
}
}