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}