use std::path::PathBuf;
use anyhow::Result;
use clap::{Parser, Subcommand};
mod account;
mod chain_config;
mod devnet;
mod envfile;
mod home;
mod rpc;
mod runtime;
mod session;
use devnet::{DEFAULT_FUND, Devnet, UpOptions};
use home::Home;
#[derive(Parser)]
#[command(version)]
struct Cli {
#[arg(long, env = "LOGOS_DEVNET_HOME", global = true)]
home: Option<PathBuf>,
#[command(subcommand)]
command: Command,
}
#[derive(Subcommand)]
enum Command {
Up(UpOptions),
Down,
Reset(UpOptions),
Status,
Fund {
account: String,
#[arg(default_value_t = DEFAULT_FUND)]
amount: u128,
},
Deploy {
name: String,
elf: PathBuf,
},
WalletConfig { dir: PathBuf },
Env,
Logs {
#[arg(short, long)]
follow: bool,
},
#[command(subcommand)]
Session(SessionCommand),
}
#[derive(Subcommand)]
enum SessionCommand {
New {
name: String,
#[arg(long = "module")]
modules: Vec<String>,
#[arg(long, default_value_t = DEFAULT_FUND)]
amount: u128,
},
Ls,
Env { name: String },
Rm { name: String },
}
fn main() -> Result<()> {
let cli = Cli::parse();
let devnet = Devnet::open(Home::locate(cli.home)?)?;
match cli.command {
Command::Up(opts) => devnet.up(&opts),
Command::Down => devnet.down(),
Command::Reset(opts) => devnet.reset(&opts),
Command::Status => devnet.status(),
Command::Fund { account, amount } => devnet.fund(&account, amount),
Command::Deploy { name, elf } => devnet.deploy(&name, &elf),
Command::WalletConfig { dir } => {
let path = devnet.write_project_wallet_config(&dir)?;
println!("{}", path.display());
Ok(())
}
Command::Env => devnet.print_env(),
Command::Logs { follow } => devnet.logs(follow),
Command::Session(command) => match command {
SessionCommand::New {
name,
modules,
amount,
} => devnet.session_new(&name, &modules, amount),
SessionCommand::Ls => devnet.session_list(),
SessionCommand::Env { name } => devnet.session_env(&name),
SessionCommand::Rm { name } => devnet.session_rm(&name),
},
}
}