use crate::codegen::ConfigDumpContent;
use clap::{Args, Parser, Subcommand, ValueEnum};
use lib_flutter_rust_bridge_codegen::{codegen::RustOpaqueCodecMode, misc::Template};
use std::path::PathBuf;
#[derive(Debug, Parser)]
#[command(author, version, about, long_about = None)]
pub(crate) struct Cli {
#[arg(short, long)]
pub verbose: bool,
#[command(subcommand)]
pub(crate) command: Commands,
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Subcommand)]
pub(crate) enum Commands {
Generate(GenerateCommandArgs),
Create(CreateCommandArgs),
Integrate(IntegrateCommandArgs),
BuildWeb(BuildWebCommandArgs),
#[clap(hide = true)]
InternalGenerate(InternalGenerateCommandArgs),
}
#[derive(Debug, Args, Default, Eq, PartialEq)]
pub(crate) struct GenerateCommandArgs {
#[arg(long)]
pub watch: bool,
#[clap(flatten)]
pub primary: GenerateCommandArgsPrimary,
}
#[derive(Debug, Args, Default, Eq, PartialEq, Clone)]
pub(crate) struct GenerateCommandArgsPrimary {
#[arg(long)]
pub config_file: Option<String>,
#[arg(short, long)]
pub rust_input: Option<String>,
#[arg(short, long)]
pub dart_output: Option<String>,
#[arg(short, long)]
pub c_output: Option<String>,
#[arg(long)]
pub duplicated_c_output: Option<Vec<String>>,
#[arg(long)]
pub rust_root: Option<String>,
#[arg(long)]
pub rust_output: Option<String>,
#[arg(long)]
pub dart_entrypoint_class_name: Option<String>,
#[arg(long)]
pub dart_format_line_length: Option<u32>,
#[arg(long)]
pub dart_preamble: Option<String>,
#[arg(long)]
pub rust_preamble: Option<String>,
#[arg(long)]
pub no_dart_enums_style: bool,
#[arg(long)]
pub no_add_mod_to_lib: bool,
#[arg(long, num_args = 1..)]
pub llvm_path: Option<Vec<String>>,
#[arg(long)]
pub llvm_compiler_opts: Option<String>,
#[arg(long, num_args = 1..)]
pub dart_root: Option<String>,
#[arg(long)]
pub no_build_runner: bool,
#[arg(long)]
pub extra_headers: Option<String>,
#[arg(long)]
pub no_web: bool,
#[arg(long)]
pub no_deps_check: bool,
#[arg(long)]
pub default_external_library_loader_web_prefix: Option<String>,
#[arg(long)]
pub wasm_bindgen_name: Option<String>,
#[arg(long)]
pub no_dart3: bool,
#[arg(long)]
pub full_dep: bool,
#[arg(long)]
pub default_rust_opaque_codec: Option<RustOpaqueCodecModeArg>,
#[arg(long, hide = true)]
pub local: bool,
#[arg(long)]
pub enable_lifetime: bool,
#[arg(long)]
pub type_64bit_int: bool,
#[arg(long)]
pub no_default_dart_async: bool,
#[arg(long)]
pub no_auto_upgrade_dependency: bool,
#[arg(long)]
pub parse_const: bool,
#[arg(long)]
pub no_dart_format: bool,
#[arg(long)]
pub no_dart_fix: bool,
#[arg(long)]
pub no_rust_format: bool,
#[arg(long)]
pub stop_on_error: bool,
#[arg(long, value_enum, num_args = 0.., default_missing_values = ["config", "ir"])]
pub dump: Option<Vec<ConfigDumpContent>>,
#[arg(long)]
pub dump_all: bool,
#[arg(long)]
pub rust_features: Option<Vec<String>>,
}
#[derive(Debug, Args)]
pub(crate) struct CreateCommandArgs {
pub(crate) name: String,
#[clap(long)]
pub(crate) org: Option<String>,
#[clap(flatten)]
pub common: CreateOrIntegrateCommandCommonArgs,
#[clap(short, long, value_enum, default_value = "app")]
pub template: TemplateArg,
}
#[derive(Debug, Args)]
pub(crate) struct IntegrateCommandArgs {
#[arg(long)]
pub(crate) no_write_lib: bool,
#[arg(long)]
pub(crate) no_integration_test: bool,
#[arg(long)]
pub(crate) no_dart_fix: bool,
#[arg(long)]
pub(crate) no_dart_format: bool,
#[clap(flatten)]
pub common: CreateOrIntegrateCommandCommonArgs,
#[clap(short, long, value_enum, default_value = "app")]
pub template: TemplateArg,
}
#[derive(Debug, Copy, Clone, ValueEnum)]
pub(crate) enum TemplateArg {
App,
Plugin,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, ValueEnum)]
pub(crate) enum RustOpaqueCodecModeArg {
Moi,
Nom,
}
#[derive(Debug, Args)]
pub(crate) struct CreateOrIntegrateCommandCommonArgs {
#[arg(long)]
pub rust_crate_name: Option<String>,
#[arg(long)]
pub rust_crate_dir: Option<String>,
#[arg(long, hide = true)]
pub local: bool,
}
#[derive(Debug, Args)]
#[command(disable_help_flag = true)]
pub(crate) struct BuildWebCommandArgs {
#[arg(long)]
pub dart_root: Option<PathBuf>,
#[arg(long, hide = true)]
pub dart_coverage: bool,
#[arg(trailing_var_arg = true, allow_hyphen_values = true, hide = true)]
pub(crate) args: Vec<String>,
}
#[derive(Debug, Args)]
pub(crate) struct InternalGenerateCommandArgs {}
impl From<TemplateArg> for Template {
fn from(value: TemplateArg) -> Self {
match value {
TemplateArg::App => Template::App,
TemplateArg::Plugin => Template::Plugin,
}
}
}
impl From<RustOpaqueCodecModeArg> for RustOpaqueCodecMode {
fn from(value: RustOpaqueCodecModeArg) -> Self {
match value {
RustOpaqueCodecModeArg::Moi => RustOpaqueCodecMode::Moi,
RustOpaqueCodecModeArg::Nom => RustOpaqueCodecMode::Nom,
}
}
}