standout_input/sources/
default.rs1use clap::ArgMatches;
2
3use crate::collector::InputCollector;
4use crate::InputError;
5
6#[derive(Debug, Clone)]
7pub struct DefaultSource<T: Clone + Send + Sync> {
8 value: T,
9}
10
11impl<T: Clone + Send + Sync> DefaultSource<T> {
12 pub fn new(value: T) -> Self {
13 Self { value }
14 }
15
16 pub fn value(&self) -> &T {
17 &self.value
18 }
19}
20
21impl<T: Clone + Send + Sync + 'static> InputCollector<T> for DefaultSource<T> {
22 fn name(&self) -> &'static str {
23 "default"
24 }
25
26 fn is_available(&self, _matches: &ArgMatches) -> bool {
27 true
28 }
29
30 fn collect(&self, _matches: &ArgMatches) -> Result<Option<T>, InputError> {
31 Ok(Some(self.value.clone()))
32 }
33}
34
35#[cfg(test)]
36mod tests {
37 use super::*;
38 use clap::Command;
39
40 fn empty_matches() -> ArgMatches {
41 Command::new("test").try_get_matches_from(["test"]).unwrap()
42 }
43
44 #[test]
45 fn default_always_available() {
46 let source = DefaultSource::new("default");
47 assert!(source.is_available(&empty_matches()));
48 }
49
50 #[test]
51 fn default_returns_value() {
52 let source = DefaultSource::new("default value".to_string());
53 let result = source.collect(&empty_matches()).unwrap();
54 assert_eq!(result, Some("default value".to_string()));
55 }
56
57 #[test]
58 fn default_with_bool() {
59 let source = DefaultSource::new(false);
60 let result = source.collect(&empty_matches()).unwrap();
61 assert_eq!(result, Some(false));
62 }
63
64 #[test]
65 fn default_with_number() {
66 let source = DefaultSource::new(42i32);
67 let result = source.collect(&empty_matches()).unwrap();
68 assert_eq!(result, Some(42));
69 }
70}