three_em_cli 0.2.0

A blazingly fast, secure, reliable, multi-language execution machine for Smart Contracts.
mod cli;
mod core_nodes;
mod dry_run;
mod local_server;
mod messages;
mod node;
mod node_crypto;
mod print_help;
mod run;
mod start;
mod utils;

use crate::cli::parse;
use crate::cli::parse::{Flags, ParseResult};
use deno_core::error::AnyError;

use crate::local_server::{start_local_server, ServerConfiguration};
use std::env;
use std::net::IpAddr;
use std::ops::Deref;
use std::str::FromStr;

static BANNER: &str = r#"
██████╗     ███████╗    ███╗   ███╗
╚════██╗    ██╔════╝    ████╗ ████║
 █████╔╝    █████╗      ██╔████╔██║
 ╚═══██╗    ██╔══╝      ██║╚██╔╝██║
██████╔╝    ███████╗    ██║ ╚═╝ ██║
╚═════╝     ╚══════╝    ╚═╝     ╚═╝

The Web3 Execution Machine
Languages supported: Javascript, Solidity, Rust, C++, C, AssemblyScript, Zig, Vyper.
"#;

fn main() -> Result<(), AnyError> {
  println!("{}", BANNER);
  println!("Version: {}", env!("CARGO_PKG_VERSION"));
  println!();

  let parse_result = parse::parse()?;

  let rt = tokio::runtime::Runtime::new()?;

  match parse_result {
    ParseResult::Help { cmd } => {
      print_help::print_help(Some(cmd.deref()));
    }
    ParseResult::Known { flag } => {
      match flag {
        Flags::Start {
          host,
          port,
          node_capacity,
        } => {
          rt.block_on(crate::start::start(host, port, node_capacity))?;
        }
        Flags::Run {
          port,
          host,
          protocol,
          tx,
          pretty_print,
          no_print,
          show_validity,
          save,
          save_path,
          benchmark,
          height,
          no_cache,
          show_errors,
        } => {
          if tx.is_none() {
            print_help::print_help(Some("run"));
            println!("{}", "Option '--contract-id' is required");
          } else {
            rt.block_on(run::run(
              port,
              host,
              protocol,
              tx.unwrap(),
              pretty_print,
              no_print,
              show_validity,
              save,
              benchmark,
              save_path,
              height,
              no_cache,
              show_errors,
            ))?;
          }
        }
        Flags::DryRun {
          host,
          port,
          protocol,
          pretty_print,
          show_validity,
          file,
        } => {
          if file.is_none() {
            print_help::print_help(Some("dry-run"));
            println!("{}", "Option '--file' is required");
          } else {
            rt.block_on(dry_run::dry_run(
              port,
              host,
              protocol,
              pretty_print,
              show_validity,
              file.unwrap(),
            ))?;
          }
        }
        Flags::Serve {
          server_port,
          server_host,
        } => {
          let ip_addr = IpAddr::from_str(server_host.as_str());
          if let Err(_) = ip_addr {
            print_help::print_help(Some("serve"));
            println!("{}", "Invalid IP Address provided in '--server-host'");
          } else {
            // Spawn the !Send future in the currently running
            // local task set.
            let local = tokio::task::LocalSet::new();
            local.block_on(
              &rt,
              start_local_server(ServerConfiguration {
                host: ip_addr.unwrap(),
                port: server_port,
              }),
            );
          }
        }
      };
    }
  }

  Ok(())
}