use clap::ValueEnum;
use crate::{contracts, reports};
#[derive(Clone, Copy, Debug, ValueEnum)]
#[clap(rename_all = "snake_case")]
pub enum StatusArg {
Draft,
Todo,
Doing,
Done,
Rejected,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
#[clap(rename_all = "snake_case")]
pub enum QueueShowFormat {
Json,
Compact,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
#[clap(rename_all = "snake_case")]
pub enum QueueListFormat {
Compact,
Long,
Json,
}
#[derive(Clone, Copy, Debug, ValueEnum)]
#[clap(rename_all = "snake_case")]
pub enum QueueReportFormat {
Text,
Json,
}
#[derive(Clone, Copy, Debug, ValueEnum)]
#[clap(rename_all = "snake_case")]
pub enum QueueExportFormat {
Csv,
Tsv,
Json,
Md,
Gh,
}
#[derive(Clone, Copy, Debug, ValueEnum)]
#[clap(rename_all = "snake_case")]
pub enum QueueImportFormat {
Csv,
Tsv,
Json,
}
#[derive(Clone, Copy, Debug, ValueEnum)]
#[clap(rename_all = "snake_case")]
pub enum QueueSortBy {
Priority,
}
impl std::fmt::Display for QueueSortBy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
QueueSortBy::Priority => f.write_str("priority"),
}
}
}
#[derive(Clone, Copy, Debug, ValueEnum)]
#[clap(rename_all = "snake_case")]
pub enum QueueListSortBy {
Priority,
CreatedAt,
UpdatedAt,
StartedAt,
ScheduledStart,
Status,
Title,
}
impl std::fmt::Display for QueueListSortBy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
QueueListSortBy::Priority => f.write_str("priority"),
QueueListSortBy::CreatedAt => f.write_str("created_at"),
QueueListSortBy::UpdatedAt => f.write_str("updated_at"),
QueueListSortBy::StartedAt => f.write_str("started_at"),
QueueListSortBy::ScheduledStart => f.write_str("scheduled_start"),
QueueListSortBy::Status => f.write_str("status"),
QueueListSortBy::Title => f.write_str("title"),
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
pub enum QueueSortOrder {
Ascending,
Descending,
}
impl QueueSortOrder {
pub(crate) fn is_descending(self) -> bool {
matches!(self, QueueSortOrder::Descending)
}
}
impl std::fmt::Display for QueueSortOrder {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
QueueSortOrder::Ascending => f.write_str("ascending"),
QueueSortOrder::Descending => f.write_str("descending"),
}
}
}
impl From<StatusArg> for contracts::TaskStatus {
fn from(value: StatusArg) -> Self {
match value {
StatusArg::Draft => contracts::TaskStatus::Draft,
StatusArg::Todo => contracts::TaskStatus::Todo,
StatusArg::Doing => contracts::TaskStatus::Doing,
StatusArg::Done => contracts::TaskStatus::Done,
StatusArg::Rejected => contracts::TaskStatus::Rejected,
}
}
}
impl From<QueueReportFormat> for reports::ReportFormat {
fn from(value: QueueReportFormat) -> Self {
match value {
QueueReportFormat::Text => reports::ReportFormat::Text,
QueueReportFormat::Json => reports::ReportFormat::Json,
}
}
}
pub(crate) fn task_eta_display(
resolved: &crate::config::Resolved,
calculator: &crate::eta_calculator::EtaCalculator,
task: &crate::contracts::Task,
) -> String {
use crate::contracts::TaskStatus;
use crate::eta_calculator::format_eta;
use crate::runner::resolve_agent_settings;
if !matches!(task.status, TaskStatus::Draft | TaskStatus::Todo) {
return "n/a".to_string();
}
let empty_cli_patch = crate::contracts::RunnerCliOptionsPatch::default();
let settings = match resolve_agent_settings(
None, None, None, &empty_cli_patch,
task.agent.as_ref(),
&resolved.config.agent,
) {
Ok(s) => s,
Err(_) => return "n/a".to_string(),
};
let phase_count = resolved.config.agent.phases.unwrap_or(3);
match calculator.estimate_new_task_total(
settings.runner.as_str(),
settings.model.as_str(),
phase_count,
) {
Some(estimate) => format_eta(estimate.remaining),
None => "n/a".to_string(),
}
}