use clap::Subcommand;
#[derive(Subcommand)]
pub(crate) enum Commands {
Daily,
Weekly,
Monthly,
Today,
Session,
Project,
Blocks,
Statusline,
Tools,
Codex {
#[command(subcommand)]
command: Option<CodexCommands>,
},
}
#[derive(Subcommand)]
pub(crate) enum CodexCommands {
Daily,
Weekly,
Monthly,
Today,
Session,
Statusline,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum SourceCommand {
Daily,
Weekly,
Monthly,
Today,
Session,
Project,
Blocks,
Statusline,
Tools,
}
impl SourceCommand {
pub(crate) fn is_statusline(self) -> bool {
matches!(self, SourceCommand::Statusline)
}
pub(crate) fn needs_today_filter(self) -> bool {
matches!(self, SourceCommand::Today | SourceCommand::Statusline)
}
}
impl From<&Commands> for SourceCommand {
#[allow(clippy::match_same_arms)] fn from(cmd: &Commands) -> Self {
match cmd {
Commands::Daily => SourceCommand::Daily,
Commands::Weekly => SourceCommand::Weekly,
Commands::Monthly => SourceCommand::Monthly,
Commands::Today => SourceCommand::Today,
Commands::Session => SourceCommand::Session,
Commands::Project => SourceCommand::Project,
Commands::Blocks => SourceCommand::Blocks,
Commands::Statusline => SourceCommand::Statusline,
Commands::Tools => SourceCommand::Tools,
Commands::Codex { .. } => SourceCommand::Daily, }
}
}
impl From<&Option<CodexCommands>> for SourceCommand {
fn from(cmd: &Option<CodexCommands>) -> Self {
match cmd {
Some(CodexCommands::Daily) | None => SourceCommand::Daily,
Some(CodexCommands::Weekly) => SourceCommand::Weekly,
Some(CodexCommands::Monthly) => SourceCommand::Monthly,
Some(CodexCommands::Today) => SourceCommand::Today,
Some(CodexCommands::Session) => SourceCommand::Session,
Some(CodexCommands::Statusline) => SourceCommand::Statusline,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct ParsedCommand {
pub(crate) source_hint: Option<&'static str>,
pub(crate) command: SourceCommand,
}
pub(crate) fn parse_command(cmd: Option<&Commands>) -> ParsedCommand {
match cmd {
Some(Commands::Codex { command }) => ParsedCommand {
source_hint: Some("codex"),
command: SourceCommand::from(command),
},
Some(cmd) => ParsedCommand {
source_hint: None,
command: SourceCommand::from(cmd),
},
None => ParsedCommand {
source_hint: None,
command: SourceCommand::Daily,
},
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_command_defaults_to_daily_without_source_hint() {
let parsed = parse_command(None);
assert_eq!(parsed.command, SourceCommand::Daily);
assert_eq!(parsed.source_hint, None);
}
#[test]
fn parse_command_codex_sets_source_hint() {
let parsed = parse_command(Some(&Commands::Codex {
command: Some(CodexCommands::Session),
}));
assert_eq!(parsed.command, SourceCommand::Session);
assert_eq!(parsed.source_hint, Some("codex"));
}
#[test]
fn parse_command_regular_keeps_no_source_hint() {
let parsed = parse_command(Some(&Commands::Weekly));
assert_eq!(parsed.command, SourceCommand::Weekly);
assert_eq!(parsed.source_hint, None);
}
}