arbor_cli/common/
app_builder.rs1use 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}