use anyhow::Result;
use clap::Parser;
use owo_colors::OwoColorize;
use wincd::clipboard;
use wincd::converter::{Converter, Direction};
use wincd::resolver;
use wincd::shell;
#[derive(Parser, Debug)]
#[command(name = "wincd", version, about, long_about = None)]
struct Cli {
path: Option<String>,
#[arg(short = 'w', long = "to-windows")]
to_windows: bool,
#[arg(short = 'm', long = "mixed")]
mixed: bool,
#[arg(short = 'p', long = "parent")]
parent: bool,
#[arg(short = 'f', long = "force")]
force: bool,
#[arg(short = 'v', long = "verbose")]
verbose: bool,
#[arg(long = "init", value_name = "SHELL")]
init: Option<String>,
#[arg(long = "no-color")]
no_color: bool,
}
fn main() {
if let Err(e) = run() {
eprintln!("{} {}", "错误:".red().bold(), e);
std::process::exit(1);
}
}
fn run() -> Result<()> {
let cli = Cli::parse();
if let Some(shell_name) = &cli.init {
let sh: shell::Shell = shell_name.parse().map_err(|e: String| anyhow::anyhow!(e))?;
print!("{}", shell::init_script(sh));
return Ok(());
}
let input = match &cli.path {
Some(p) => p.clone(),
None => clipboard::read_clipboard_path()?,
};
let converter = Converter::new();
if cli.to_windows {
let result = converter.to_windows(&input, cli.mixed)?;
if cli.verbose {
print_verbose(&result);
}
println!("{}", result.converted);
} else {
let result = converter.to_wsl(&input)?;
if cli.verbose {
print_verbose(&result);
}
let resolved = resolver::resolve_path(&result.converted, cli.parent, cli.force);
if !resolved.exact && !cli.force {
eprintln!(
"{} 路径不存在: {}",
"警告:".yellow().bold(),
resolved.path.display()
);
if !resolved.suggestions.is_empty() {
eprintln!("{}", "可能的目录:".cyan());
for s in &resolved.suggestions {
eprintln!(" {}", s.display());
}
}
}
println!("{}", resolved.path.display());
}
Ok(())
}
fn print_verbose(result: &wincd::converter::ConvertResult) {
let direction = match result.direction {
Direction::ToWsl => "Windows → WSL",
Direction::ToWindows => "WSL → Windows",
};
eprintln!("{} {}", "方向:".dimmed(), direction.dimmed());
eprintln!("{} {}", "原始:".dimmed(), result.original.dimmed());
eprintln!("{} {}", "转换:".dimmed(), result.converted.green());
eprintln!();
}