1use crate::domain::ai::{AiProvider, AiSessionMode};
2use crate::domain::review::{Author, DiffSide, ReviewState};
3use std::str::FromStr;
4use thiserror::Error;
5
6#[derive(Debug, Clone, Error)]
7pub enum CliArgError {
8 #[error("invalid state: {value}")]
9 InvalidState { value: String },
10 #[error("invalid side: {value}")]
11 InvalidSide { value: String },
12 #[error("invalid author: {value}")]
13 InvalidAuthor { value: String },
14 #[error("invalid ai provider: {value}")]
15 InvalidAiProvider { value: String },
16 #[error("invalid ai session mode: {value}")]
17 InvalidAiSessionMode { value: String },
18}
19
20#[derive(Debug, Clone)]
21pub struct StateArg(pub ReviewState);
22
23impl FromStr for StateArg {
24 type Err = CliArgError;
25
26 fn from_str(input: &str) -> Result<Self, Self::Err> {
27 input
28 .parse::<ReviewState>()
29 .map(Self)
30 .map_err(|_| CliArgError::InvalidState {
31 value: input.to_string(),
32 })
33 }
34}
35
36#[derive(Debug, Clone)]
37pub struct SideArg(pub DiffSide);
38
39impl FromStr for SideArg {
40 type Err = CliArgError;
41
42 fn from_str(input: &str) -> Result<Self, Self::Err> {
43 input
44 .parse::<DiffSide>()
45 .map(Self)
46 .map_err(|_| CliArgError::InvalidSide {
47 value: input.to_string(),
48 })
49 }
50}
51
52#[derive(Debug, Clone)]
53pub struct AuthorArg(pub Author);
54
55impl FromStr for AuthorArg {
56 type Err = CliArgError;
57
58 fn from_str(input: &str) -> Result<Self, Self::Err> {
59 input
60 .parse::<Author>()
61 .map(Self)
62 .map_err(|_| CliArgError::InvalidAuthor {
63 value: input.to_string(),
64 })
65 }
66}
67
68#[derive(Debug, Clone)]
69pub struct AiProviderArg(pub AiProvider);
70
71impl FromStr for AiProviderArg {
72 type Err = CliArgError;
73
74 fn from_str(input: &str) -> Result<Self, Self::Err> {
75 input
76 .parse::<AiProvider>()
77 .map(Self)
78 .map_err(|_| CliArgError::InvalidAiProvider {
79 value: input.to_string(),
80 })
81 }
82}
83
84#[derive(Debug, Clone)]
85pub struct AiSessionModeArg(pub AiSessionMode);
86
87impl FromStr for AiSessionModeArg {
88 type Err = CliArgError;
89
90 fn from_str(input: &str) -> Result<Self, Self::Err> {
91 input
92 .parse::<AiSessionMode>()
93 .map(Self)
94 .map_err(|_| CliArgError::InvalidAiSessionMode {
95 value: input.to_string(),
96 })
97 }
98}