1use crate::newtypes::libcnb_newtype;
2use serde::Serialize;
3use std::collections::HashMap;
4
5#[derive(Serialize, Clone)]
9pub struct ExecDProgramOutput(HashMap<ExecDProgramOutputKey, String>);
10
11impl ExecDProgramOutput {
12 #[must_use]
13 pub fn new(map: HashMap<ExecDProgramOutputKey, String>) -> Self {
14 Self(map)
15 }
16}
17
18impl<K: Into<ExecDProgramOutputKey>, V: Into<String>, A: IntoIterator<Item = (K, V)>> From<A>
19 for ExecDProgramOutput
20{
21 fn from(a: A) -> Self {
22 Self(
23 a.into_iter()
24 .map(|(key, value)| (key.into(), value.into()))
25 .collect(),
26 )
27 }
28}
29
30libcnb_newtype!(
31 exec_d,
32 exec_d_program_output_key,
45 ExecDProgramOutputKey,
69 ExecDProgramOutputKeyError,
70 r"^[A-Za-z0-9_-]+$"
71);
72
73#[cfg(test)]
74mod tests {
75 use super::*;
76
77 #[test]
78 fn exec_d_program_output_key_validation_valid() {
79 assert!("FOO".parse::<ExecDProgramOutputKey>().is_ok());
80 assert!("foo".parse::<ExecDProgramOutputKey>().is_ok());
81 assert!("FOO_BAR".parse::<ExecDProgramOutputKey>().is_ok());
82 assert!("foo_bar".parse::<ExecDProgramOutputKey>().is_ok());
83 assert!("123".parse::<ExecDProgramOutputKey>().is_ok());
84 assert!("FOO-bar".parse::<ExecDProgramOutputKey>().is_ok());
85 assert!("foo-BAR".parse::<ExecDProgramOutputKey>().is_ok());
86 }
87
88 #[test]
89 fn exec_d_program_output_key_validation_invalid() {
90 assert_eq!(
91 "FOO BAR".parse::<ExecDProgramOutputKey>(),
92 Err(ExecDProgramOutputKeyError::InvalidValue(String::from(
93 "FOO BAR"
94 )))
95 );
96
97 assert_eq!(
98 "FOO.BAR".parse::<ExecDProgramOutputKey>(),
99 Err(ExecDProgramOutputKeyError::InvalidValue(String::from(
100 "FOO.BAR"
101 )))
102 );
103
104 assert_eq!(
105 "FOO/BAR".parse::<ExecDProgramOutputKey>(),
106 Err(ExecDProgramOutputKeyError::InvalidValue(String::from(
107 "FOO/BAR"
108 )))
109 );
110
111 assert_eq!(
112 "FÜCHSCHEN".parse::<ExecDProgramOutputKey>(),
113 Err(ExecDProgramOutputKeyError::InvalidValue(String::from(
114 "FÜCHSCHEN"
115 )))
116 );
117
118 assert_eq!(
119 "🦊".parse::<ExecDProgramOutputKey>(),
120 Err(ExecDProgramOutputKeyError::InvalidValue(String::from("🦊")))
121 );
122
123 assert_eq!(
124 "".parse::<ExecDProgramOutputKey>(),
125 Err(ExecDProgramOutputKeyError::InvalidValue(String::new()))
126 );
127 }
128}