Skip to main content

args_extractor/
extractor.rs

1use std::env;
2use crate::{builder::PromptBuilder, prompt::Prompt, stdin::{StdinService, StdinServiceMock}};
3
4pub struct PromptExtractor{}
5impl PromptExtractor {
6
7    pub fn extract() -> Result<Prompt, String> {
8        let args = env::args();
9
10        Ok(PromptBuilder::new(StdinService::new())
11            .build(args)?)
12    }
13
14    pub fn extract_from(args : impl Iterator<Item = String>) -> Result<Prompt, String> {
15        Ok(PromptBuilder::new(StdinServiceMock { is_terminal: true })
16        .build(args)?)
17    }
18}
19
20#[cfg(test)]
21mod tests {
22    use super::*;
23    use std::vec::IntoIter;
24    
25    fn query_into_iter(input: &str) -> IntoIter<String> {
26        input.split_whitespace().map(String::from).collect::<Vec<String>>().into_iter()
27    }
28
29    #[test]
30    fn check_no_arguments() {
31
32        let args= query_into_iter("");
33        let prompt = PromptExtractor::extract_from(args);
34
35        assert!(prompt.is_err());
36    }
37
38    #[test]
39    fn check_arguments() {
40
41        let args= query_into_iter("program.exe arg1 arg2");
42        let prompt = PromptExtractor::extract_from(args);
43
44        assert!(prompt.is_ok());
45        let prompt = prompt.expect("Cannot be None");
46
47        assert_eq!(prompt.program_name, "program.exe");
48        assert_eq!(prompt.arguments.is_some_and(|args| args.len() == 2), true);
49        assert!(prompt.parameters.is_none());
50    }
51
52    #[test]
53    fn check_parameter() {
54
55        let args= query_into_iter("program.exe -h");
56        let prompt = PromptExtractor::extract_from(args);
57
58        assert!(prompt.is_ok());
59        let prompt = prompt.expect("Cannot be None");
60
61        assert_eq!(prompt.program_name, "program.exe");
62        assert!(prompt.arguments.is_none());
63        assert_eq!(prompt.parameters.is_some_and(|params| params.contains_key("-h")), true);
64    }
65
66    #[test]
67    fn check_two_parameters() {
68        
69        let args= query_into_iter("program.exe -h --test");
70        let prompt = PromptExtractor::extract_from(args);
71
72        assert!(prompt.is_ok());
73        let prompt = prompt.expect("Cannot be None");
74
75        assert_eq!(prompt.program_name, "program.exe");
76        assert!(prompt.arguments.is_none());
77        assert_eq!(prompt.parameters.is_some_and(|params| params.len() == 2 && params.contains_key("--test")), true);
78    }
79
80    #[test]
81    fn check_argument_parameters() {
82
83        let args= query_into_iter("program.exe test -h --test");
84        let prompt = PromptExtractor::extract_from(args);
85
86        assert!(prompt.is_ok());
87        let prompt = prompt.expect("Cannot be None");
88
89        assert_eq!(prompt.program_name, "program.exe");
90        assert_eq!(prompt.arguments.is_some_and(|args| args.len() == 1), true);
91        assert_eq!(prompt.parameters.is_some_and(|params| params.len() == 2 && params.contains_key("--test")), true);
92    }
93
94    #[test]
95    fn check_parameter_with_arguments() {
96
97        let args= query_into_iter("program.exe -h --test 1");
98        let prompt = PromptExtractor::extract_from(args);
99
100        assert!(prompt.is_ok());
101        let prompt = prompt.expect("Cannot be None");
102
103        assert_eq!(prompt.program_name, "program.exe");
104        assert!(prompt.arguments.is_none());
105        assert_eq!(prompt.parameters.is_some_and(|params| params.len() == 2 && params.get("--test").is_some_and(|param| param.len() == 1)), true);
106    }
107
108}