Skip to main content

parley/cli/
args.rs

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}