standout_input/sources/
default.rs1use clap::ArgMatches;
4
5use crate::collector::InputCollector;
6use crate::InputError;
7
8#[derive(Debug, Clone)]
23pub struct DefaultSource<T: Clone + Send + Sync> {
24 value: T,
25}
26
27impl<T: Clone + Send + Sync> DefaultSource<T> {
28 pub fn new(value: T) -> Self {
30 Self { value }
31 }
32
33 pub fn value(&self) -> &T {
35 &self.value
36 }
37}
38
39impl<T: Clone + Send + Sync + 'static> InputCollector<T> for DefaultSource<T> {
40 fn name(&self) -> &'static str {
41 "default"
42 }
43
44 fn is_available(&self, _matches: &ArgMatches) -> bool {
45 true }
47
48 fn collect(&self, _matches: &ArgMatches) -> Result<Option<T>, InputError> {
49 Ok(Some(self.value.clone()))
50 }
51}
52
53#[cfg(test)]
54mod tests {
55 use super::*;
56 use clap::Command;
57
58 fn empty_matches() -> ArgMatches {
59 Command::new("test").try_get_matches_from(["test"]).unwrap()
60 }
61
62 #[test]
63 fn default_always_available() {
64 let source = DefaultSource::new("default");
65 assert!(source.is_available(&empty_matches()));
66 }
67
68 #[test]
69 fn default_returns_value() {
70 let source = DefaultSource::new("default value".to_string());
71 let result = source.collect(&empty_matches()).unwrap();
72 assert_eq!(result, Some("default value".to_string()));
73 }
74
75 #[test]
76 fn default_with_bool() {
77 let source = DefaultSource::new(false);
78 let result = source.collect(&empty_matches()).unwrap();
79 assert_eq!(result, Some(false));
80 }
81
82 #[test]
83 fn default_with_number() {
84 let source = DefaultSource::new(42i32);
85 let result = source.collect(&empty_matches()).unwrap();
86 assert_eq!(result, Some(42));
87 }
88}