mod init;
pub mod sessions;
pub mod history;
pub mod search;
pub mod contacts;
pub mod export;
pub mod watch;
pub mod daemon_cmd;
pub mod transport;
use anyhow::Result;
use clap::{Parser, Subcommand};
#[derive(Parser)]
#[command(name = "wx", version = "0.1.0", about = "wx — 微信本地数据 CLI")]
pub struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Init {
#[arg(long)]
force: bool,
},
Sessions {
#[arg(short = 'n', long, default_value = "20")]
limit: usize,
#[arg(long)]
json: bool,
},
History {
chat: String,
#[arg(short = 'n', long, default_value = "50")]
limit: usize,
#[arg(long, default_value = "0")]
offset: usize,
#[arg(long)]
since: Option<String>,
#[arg(long)]
until: Option<String>,
#[arg(long)]
json: bool,
},
Search {
keyword: String,
#[arg(long = "in", value_name = "CHAT")]
chats: Vec<String>,
#[arg(short = 'n', long, default_value = "20")]
limit: usize,
#[arg(long)]
since: Option<String>,
#[arg(long)]
until: Option<String>,
#[arg(long)]
json: bool,
},
Contacts {
#[arg(short = 'q', long)]
query: Option<String>,
#[arg(short = 'n', long, default_value = "50")]
limit: usize,
#[arg(long)]
json: bool,
},
Export {
chat: String,
#[arg(long)]
since: Option<String>,
#[arg(long)]
until: Option<String>,
#[arg(short = 'n', long, default_value = "500")]
limit: usize,
#[arg(short = 'f', long, default_value = "markdown", value_parser = ["markdown", "txt", "json"])]
format: String,
#[arg(short = 'o', long)]
output: Option<String>,
},
Watch {
#[arg(long)]
chat: Option<String>,
#[arg(long)]
json: bool,
},
Daemon {
#[command(subcommand)]
cmd: DaemonCommands,
},
}
#[derive(Subcommand)]
pub enum DaemonCommands {
Status,
Stop,
Logs {
#[arg(short = 'f', long)]
follow: bool,
#[arg(short = 'n', long, default_value = "50")]
lines: usize,
},
}
pub fn run() {
let cli = Cli::parse();
if let Err(e) = dispatch(cli) {
eprintln!("错误: {}", e);
std::process::exit(1);
}
}
fn dispatch(cli: Cli) -> Result<()> {
match cli.command {
Commands::Init { force } => init::cmd_init(force),
Commands::Sessions { limit, json } => sessions::cmd_sessions(limit, json),
Commands::History { chat, limit, offset, since, until, json } => {
history::cmd_history(chat, limit, offset, since, until, json)
}
Commands::Search { keyword, chats, limit, since, until, json } => {
search::cmd_search(keyword, chats, limit, since, until, json)
}
Commands::Contacts { query, limit, json } => contacts::cmd_contacts(query, limit, json),
Commands::Export { chat, since, until, limit, format, output } => {
export::cmd_export(chat, since, until, limit, format, output)
}
Commands::Watch { chat, json } => watch::cmd_watch(chat, json),
Commands::Daemon { cmd } => daemon_cmd::cmd_daemon(cmd),
}
}