omni_dev/cli/voice/
review.rs1use std::io::Write;
9
10use anyhow::Result;
11use clap::Parser;
12
13use crate::voice::clock::SystemClock;
14use crate::voice::det::SystemUlidRng;
15use crate::voice::review::{run_review, ReviewOptions, What};
16
17#[derive(Parser)]
26pub struct ReviewCommand {
27 #[arg(value_name = "SESSION_ID")]
29 pub session_id: String,
30
31 #[arg(long, value_enum, default_value_t = What::All)]
35 pub what: What,
36}
37
38impl ReviewCommand {
39 pub fn execute(self) -> Result<()> {
43 let opts = ReviewOptions {
44 session_id: self.session_id,
45 what: self.what,
46 ulid_rng: Box::new(SystemUlidRng),
47 clock: Box::new(SystemClock),
48 session_root_override: None,
49 };
50 let mut buf: Vec<u8> = Vec::new();
51 run_review(opts, &mut buf)?;
52 let mut stdout = std::io::stdout().lock();
53 stdout.write_all(&buf)?;
54 stdout.flush()?;
55 Ok(())
56 }
57}
58
59#[cfg(test)]
60#[allow(clippy::unwrap_used, clippy::expect_used)]
61mod tests {
62 use super::*;
63 use clap::Parser;
64
65 #[derive(Parser)]
66 struct TestCli {
67 #[command(flatten)]
68 review: ReviewCommand,
69 }
70
71 #[test]
72 fn parses_session_id_and_defaults_to_all() {
73 let cli = TestCli::try_parse_from(["test", "demo"]).unwrap();
74 assert_eq!(cli.review.session_id, "demo");
75 assert_eq!(cli.review.what, What::All);
76 }
77
78 #[test]
79 fn parses_what_flag() {
80 let cli = TestCli::try_parse_from(["test", "demo", "--what", "todos"]).unwrap();
81 assert_eq!(cli.review.what, What::Todos);
82 }
83
84 #[test]
85 fn rejects_unknown_what_value() {
86 let result = TestCli::try_parse_from(["test", "demo", "--what", "garbage"]);
87 let Err(err) = result else {
88 panic!("expected parse failure for unknown --what value");
89 };
90 assert!(err.to_string().contains("invalid value"));
91 }
92
93 #[test]
94 fn rejects_missing_session_id() {
95 let result = TestCli::try_parse_from(["test"]);
96 let Err(err) = result else {
97 panic!("expected parse failure when SESSION_ID is missing");
98 };
99 assert!(err.to_string().to_lowercase().contains("session"));
100 }
101}