use std::path::PathBuf;
use clap::{Parser, Subcommand, ValueEnum};
use clap_verbosity_flag::Verbosity;
use map_core::folders::Folder;
use pbap_core::phonebook::PhonebookPath;
#[derive(Parser, Debug)]
#[command(name = "imsg", version, about = "iMessage client over Bluetooth MAP/PBAP")]
pub(crate) struct Cli {
#[arg(long, global = true)]
pub(crate) hub: bool,
#[arg(long, global = true, value_name = "ADDR")]
pub(crate) device: Option<String>,
#[arg(long, global = true, value_name = "PATH")]
pub(crate) config: Option<PathBuf>,
#[command(flatten)]
pub(crate) verbosity: Verbosity,
#[command(subcommand)]
pub(crate) command: Command,
}
#[derive(Subcommand, Debug)]
pub(crate) enum Command {
Send {
number: String,
message: String,
},
List {
folder: Option<FolderArg>,
#[arg(long)]
unread: bool,
#[arg(long, short = 'l')]
long: bool,
#[arg(long, value_name = "NUMBER")]
from: Option<String>,
#[arg(long, value_name = "DATE")]
since: Option<String>,
#[arg(long, value_name = "N")]
limit: Option<u16>,
#[arg(long, value_name = "N")]
offset: Option<u16>,
},
Get {
handle: String,
#[arg(long)]
folder: Option<FolderArg>,
#[arg(long)]
mark_read: bool,
},
Delete {
handle: String,
#[arg(long)]
folder: Option<FolderArg>,
#[arg(long)]
undelete: bool,
},
Contacts {
#[arg(long, conflicts_with_all = ["get", "lookup"])]
list: bool,
#[arg(long, value_name = "HANDLE", conflicts_with = "lookup")]
get: Option<String>,
#[arg(long, value_name = "NUMBER")]
lookup: Option<String>,
#[arg(long, value_enum, default_value = "pb")]
path: PathArg,
#[arg(long)]
raw: bool,
#[arg(long, value_name = "N")]
limit: Option<u16>,
#[arg(long, value_name = "N")]
page: Option<u16>,
},
Threads,
Watch,
Sync {
#[arg(long, value_enum)]
folder: Option<FolderArg>,
},
Unsync {
#[arg(long)]
purge: bool,
},
Folders,
Hub,
Spoke {
#[command(subcommand)]
cmd: SpokeCmd,
},
Config {
#[command(subcommand)]
cmd: ConfigCmd,
},
Broker {
#[command(subcommand)]
cmd: BrokerCmd,
},
#[command(name = "__broker_serve", hide = true)]
BrokerServe,
}
#[derive(Subcommand, Debug)]
pub(crate) enum BrokerCmd {
Status,
}
#[derive(Subcommand, Debug)]
pub(crate) enum ConfigCmd {
Show,
SetDevice {
address: String,
},
}
#[derive(Subcommand, Debug)]
pub(crate) enum SpokeCmd {
Add {
key: String,
},
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, ValueEnum)]
pub(crate) enum FolderArg {
Inbox,
Sent,
Outbox,
Deleted,
}
pub(crate) const fn folder_of(arg: Option<FolderArg>) -> Folder {
match arg {
Some(FolderArg::Inbox) | None => Folder::Inbox,
Some(FolderArg::Sent) => Folder::Sent,
Some(FolderArg::Outbox) => Folder::Outbox,
Some(FolderArg::Deleted) => Folder::Deleted,
}
}
pub(crate) const fn path_of(arg: PathArg) -> PhonebookPath {
match arg {
PathArg::Pb => PhonebookPath::Pb,
PathArg::Ich => PhonebookPath::Ich,
PathArg::Och => PhonebookPath::Och,
PathArg::Mch => PhonebookPath::Mch,
PathArg::Cch => PhonebookPath::Cch,
PathArg::Spd => PhonebookPath::Spd,
PathArg::Fav => PhonebookPath::Fav,
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, ValueEnum)]
pub(crate) enum PathArg {
Pb,
Ich,
Och,
Mch,
Cch,
Spd,
Fav,
}