Skip to main content

codex_ops/stats/
mod.rs

1mod accumulators;
2mod cli;
3mod events;
4mod formatters;
5mod reports;
6mod scan;
7
8pub use crate::time::StatGroupBy;
9pub use cli::{
10    read_usage_records_report, resolve_stat_range_options_from_raw, run_stat_command,
11    ResolvedStatRangeOptions, StatCommandOptions,
12};
13pub use reports::{
14    SkippedEvents, TokenUsage, UsageDiagnostics, UsageRecord, UsageRecordsReadOptions,
15    UsageRecordsReport,
16};
17
18use crate::error::AppError;
19
20#[derive(Debug, Clone, Copy, Eq, PartialEq)]
21pub enum StatFormat {
22    Table,
23    Json,
24    Csv,
25    Markdown,
26}
27
28impl StatFormat {
29    fn parse(value: &str) -> Result<Self, AppError> {
30        match value {
31            "table" => Ok(Self::Table),
32            "json" => Ok(Self::Json),
33            "csv" => Ok(Self::Csv),
34            "markdown" => Ok(Self::Markdown),
35            _ => Err(AppError::invalid_input(
36                "Invalid format value. Expected one of: table, json, csv, markdown.",
37            )),
38        }
39    }
40}
41
42#[derive(Debug, Clone, Copy, Eq, PartialEq)]
43pub enum StatSort {
44    Time,
45    Tokens,
46    Credits,
47    Calls,
48    Sessions,
49}
50
51impl StatSort {
52    fn parse(value: &str) -> Result<Self, AppError> {
53        match value {
54            "time" => Ok(Self::Time),
55            "tokens" => Ok(Self::Tokens),
56            "credits" => Ok(Self::Credits),
57            "calls" => Ok(Self::Calls),
58            "sessions" => Ok(Self::Sessions),
59            _ => Err(AppError::invalid_input(
60                "Invalid sort value. Expected one of: time, tokens, credits, calls, sessions.",
61            )),
62        }
63    }
64
65    fn as_str(self) -> &'static str {
66        match self {
67            Self::Time => "time",
68            Self::Tokens => "tokens",
69            Self::Credits => "credits",
70            Self::Calls => "calls",
71            Self::Sessions => "sessions",
72        }
73    }
74}