Skip to main content

standout_input/sources/
default.rs

1use 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}