arbor_cli/common/
app_builder.rs

1use std::error::Error;
2
3use clap::Parser;
4
5use super::autocomplete::Autocomplete;
6
7#[derive(Parser, Debug)]
8#[command(version, about, long_about = None)]
9pub struct Args {
10    #[arg(short, long)]
11    language: Option<String>,
12
13    #[arg(short, long)]
14    thread_count: Option<u8>,
15
16    #[arg(short, long)]
17    max_suggestion: Option<u8>,
18
19    #[arg(short, long, default_value_t = false)]
20    backup: bool,
21
22    #[arg(short, long, requires("backup"))]
23    output: Option<String>,
24}
25
26impl Arbor {
27    pub async fn build() -> Result<Arbor, Box<dyn Error>>
28    where
29        Self: Sync,
30    {
31        let args = Args::parse();
32        let output = args.output.as_deref();
33
34        Ok(Arbor {
35            autocomplete: Autocomplete::build(
36                args.language.clone(),
37                args.thread_count,
38                args.max_suggestion,
39                args.backup,
40                output,
41            )
42            .await?,
43        })
44    }
45}
46
47pub struct Arbor {
48    pub autocomplete: Autocomplete,
49}
50
51#[cfg(test)]
52mod tests {
53    use std::ffi::OsString;
54
55    use super::*;
56
57    #[test]
58    fn it_initializes_args() -> Result<(), Box<dyn Error>> {
59        let args = get_args(&["arbor", "--language", "en-US"])?;
60
61        assert_eq!(args.language, Some("en-US".to_string()));
62
63        Ok(())
64    }
65
66    #[tokio::test]
67    async fn it_builds_app() -> Result<(), Box<dyn Error>> {
68        let mut arbor = Arbor::build().await?;
69        let word = "hello".to_string();
70
71        arbor.autocomplete.insert_word(word.clone()).await?;
72
73        let suggestion = arbor.autocomplete.suggest_word("hel").await?;
74
75        assert_eq!(suggestion.iter().nth(0).unwrap().to_owned(), word);
76
77        Ok(())
78    }
79
80    fn get_args<I, T>(itr: I) -> Result<Args, Box<dyn Error>>
81    where
82        I: IntoIterator<Item = T>,
83        T: Into<OsString> + Clone,
84    {
85        return Ok(Args::try_parse_from(itr)?);
86    }
87}