use clap::{Parser, Subcommand, ValueEnum};
use serde::{Deserialize, Serialize};
use std::collections::{BTreeMap, HashMap};
use std::time::Duration;
use std::path::PathBuf;
#[derive(Subcommand, Debug)]
pub enum WasmSubCommand {
Load(WasmLoadCommand),
List(WasmListCommand),
Execute(WasmExecuteCommand),
Benchmark(WasmBenchmarkCommand),
Profile(WasmProfileCommand),
Analyze(WasmAnalyzeCommand),
Cache(WasmCacheCommand),
}
#[derive(Parser, Debug, Clone)]
pub struct WasmLoadCommand {
pub module: PathBuf,
#[arg(short, long)]
pub name: Option<String>,
#[arg(short, long, default_value = "true")]
pub verify: bool,
#[arg(short, long, default_value = "true")]
pub precompile: bool,
#[arg(short, long)]
pub verbose: bool,
}
#[derive(Parser, Debug, Clone)]
pub struct WasmListCommand {
#[arg(short, long, value_enum, default_value = "table")]
pub format: WasmListFormat,
#[arg(short, long)]
pub status: Option<WasmModuleStatus>,
#[arg(short, long)]
pub detailed: bool,
#[arg(short, long)]
pub filter: Option<String>,
}
#[derive(Parser, Debug)]
pub struct WasmExecuteCommand {
pub module: PathBuf,
pub function: String,
#[arg(short, long)]
pub args: Option<String>,
#[arg(short, long, default_value = "30")]
pub timeout: u64,
#[arg(short, long, default_value = "1")]
pub repeat: u32,
#[arg(short, long, value_enum, default_value = "text")]
pub output: WasmOutputFormat,
}
#[derive(Parser, Debug, Clone)]
pub struct WasmBenchmarkCommand {
pub module: PathBuf,
#[arg(short, long)]
pub function: Option<String>,
#[arg(short, long, default_value = "10")]
pub duration: u64,
#[arg(short, long, default_value = "2")]
pub warmup: u64,
#[arg(short, long, default_value = "1")]
pub threads: u32,
#[arg(short, long, value_enum, default_value = "text")]
pub format: WasmOutputFormat,
#[arg(short, long)]
pub output: Option<PathBuf>,
}
#[derive(Parser, Debug, Clone)]
pub struct WasmProfileCommand {
pub module: PathBuf,
#[arg(short, long)]
pub function: Option<String>,
#[arg(short, long, default_value = "10")]
pub duration: u64,
#[arg(short, long, default_value = "1000")]
pub sampling_rate: u32,
#[arg(short, long, value_enum, default_value = "html")]
pub format: WasmProfileFormat,
#[arg(short, long)]
pub output: Option<PathBuf>,
}
#[derive(Parser, Debug, Clone)]
pub struct WasmAnalyzeCommand {
pub module: PathBuf,
#[arg(short, long, value_enum, default_value = "detailed")]
pub level: WasmAnalyzeLevel,
#[arg(short, long, value_enum, default_value = "text")]
pub format: WasmOutputFormat,
#[arg(short, long)]
pub output: Option<PathBuf>,
}
#[derive(Parser, Debug, Clone)]
pub struct WasmCacheCommand {
#[command(subcommand)]
pub action: WasmCacheAction,
}
#[derive(Subcommand, Debug, Clone)]
pub enum WasmCacheAction {
Stats(WasmCacheStatsCommand),
Clear(WasmCacheClearCommand),
Warmup(WasmCacheWarmupCommand),
Cleanup(WasmCacheCleanupCommand),
}
#[derive(Parser, Debug, Clone)]
pub struct WasmCacheStatsCommand {
#[arg(short, long)]
pub detailed: bool,
#[arg(short, long, value_enum, default_value = "text")]
pub format: WasmOutputFormat,
}
#[derive(Parser, Debug, Clone)]
pub struct WasmCacheClearCommand {
#[arg(short, long, value_enum, default_value = "all")]
pub level: WasmCacheLevel,
#[arg(short, long)]
pub force: bool,
}
#[derive(Parser, Debug, Clone)]
pub struct WasmCacheWarmupCommand {
pub modules: Vec<PathBuf>,
#[arg(short, long, default_value = "4")]
pub concurrency: usize,
}
#[derive(Parser, Debug, Clone)]
pub struct WasmCacheCleanupCommand {
#[arg(short, long, default_value = "1")]
pub threshold: u32,
#[arg(short, long, default_value = "24")]
pub max_age: u64,
}
#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq)]
pub enum WasmListFormat {
Table,
Json,
Csv,
}
#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq)]
pub enum WasmOutputFormat {
Text,
Json,
Csv,
}
#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq)]
pub enum WasmProfileFormat {
Text,
Html,
Json,
}
#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq)]
pub enum WasmAnalyzeLevel {
Basic,
Detailed,
Full,
}
#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq)]
pub enum WasmCacheLevel {
L1,
L2,
All,
}
#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum WasmModuleStatus {
Loaded,
Unloaded,
Compiled,
Error,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct WasmModuleInfo {
pub name: String,
pub path: PathBuf,
pub size: u64,
pub compiled_size: u64,
pub functions: Vec<String>,
pub memory_usage: u64,
pub load_time: Duration,
pub compilation_time: Duration,
pub cache_hits: u64,
pub status: WasmModuleStatus,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct WasmBenchmarkResult {
pub module: String,
pub function: String,
pub duration: Duration,
pub iterations: u32,
pub ops_per_second: f64,
pub min_time: Duration,
pub max_time: Duration,
pub avg_time: Duration,
pub p50_time: Duration,
pub p95_time: Duration,
pub p99_time: Duration,
pub memory_usage: u64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct WasmCacheStats {
pub l1_cache: L1CacheStats,
pub l2_cache: L2CacheStats,
pub total_modules: u64,
pub total_memory_usage: u64,
pub hit_rate: f64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct L1CacheStats {
pub capacity: usize,
pub current_size: usize,
pub entries: usize,
pub hit_rate: f64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct L2CacheStats {
pub capacity: usize,
pub current_size: usize,
pub entries: usize,
pub hit_rate: f64,
pub disk_usage: u64,
}