mod build;
mod host;
mod info;
mod init_cmd;
mod run;
mod sig;
mod version;
mod wasm_target;
use std::path::PathBuf;
use anyhow::Result;
use clap::{Parser, Subcommand};
use self::version::MODULE_RELEASE;
#[derive(Debug, Parser)]
#[command(
name = "module",
display_name = "Surrealism command-line interface",
about = "Manage and execute WASM modules",
version = MODULE_RELEASE.as_str(),
arg_required_else_help = true,
)]
pub struct ModuleCommandArgs {
#[command(subcommand)]
command: ModuleCommand,
}
#[derive(Debug, Subcommand)]
enum ModuleCommand {
Init {
#[arg(long)]
headless: bool,
#[arg(long)]
org: Option<String>,
#[arg(long)]
name: Option<String>,
#[arg(value_name = "PATH")]
path: Option<PathBuf>,
},
Run {
#[arg(long = "arg", value_parser = parse_value)]
args: Vec<surrealdb_types::Value>,
#[arg(long)]
fnc: Option<String>,
#[arg(value_name = "FILE")]
file: PathBuf,
},
Sig {
#[arg(long)]
fnc: Option<String>,
#[arg(value_name = "FILE")]
file: PathBuf,
},
Info {
#[arg(value_name = "FILE")]
file: PathBuf,
},
Build {
#[arg(long)]
debug: bool,
#[arg(short = 'o', long)]
out: Option<PathBuf>,
#[arg(value_name = "SOURCE_PATH")]
path: Option<PathBuf>,
},
Version,
}
pub(super) fn parse_value(s: &str) -> Result<surrealdb_types::Value, String> {
crate::core::syn::value(s).map_err(|e| format!("Invalid value: {e}"))
}
pub async fn init(
ModuleCommandArgs {
command,
}: ModuleCommandArgs,
) -> Result<()> {
match command {
ModuleCommand::Init {
headless,
org,
name,
path,
} => init_cmd::init(path, org, name, headless).await,
ModuleCommand::Run {
args,
fnc,
file,
} => run::init(file, fnc, args).await,
ModuleCommand::Sig {
fnc,
file,
} => sig::init(file, fnc).await,
ModuleCommand::Info {
file,
} => info::init(file).await,
ModuleCommand::Build {
debug,
out,
path,
} => build::init(path, out, debug).await,
ModuleCommand::Version => version::init().await,
}
}