args_extractor/
extractor.rs1use 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}