11use crate :: params:: ParamKey ;
22use crate :: params:: ParamVal ;
33use crate :: Parameters ;
4-
5- /// An error that occurs as a result of a failed conversion of a `ParameterVal`
6- #[ derive( Debug ) ]
7- pub enum FromParameterValueError {
8- /// The data that was being attempted for conversion was not of the expected type.
9- UnexpectedType ,
10- }
11-
12- /// A trait that is used to create a type from a provided `ParamVal`. This
13- /// trait should be implemented when a type should be able to be converted from
14- /// a single `ParamVal` type.
15- ///
16- /// # Example
17- /// ```
18- /// use attribution::FromParameterValue;
19- /// use attribution::ParamVal;
20- ///
21- /// let param_val = ParamVal::Bool(true);
22- /// let from_result = bool::from_parameter_value(param_val);
23- /// assert_eq!(from_result.unwrap(), true);
24- /// ```
25- pub trait FromParameterValue : Sized {
26- /// Tries to create a type from the provided `ParamVal`
27- fn from_parameter_value ( parameter_val : ParamVal ) -> Result < Self , FromParameterValueError > ;
28- }
29-
30- impl FromParameterValue for u64 {
31- fn from_parameter_value ( parameter_val : ParamVal ) -> Result < Self , FromParameterValueError > {
32- if let ParamVal :: UnsignedInt ( val) = parameter_val {
33- Ok ( val)
34- } else {
35- Err ( FromParameterValueError :: UnexpectedType )
36- }
37- }
38- }
39-
40- impl FromParameterValue for bool {
41- fn from_parameter_value ( parameter_val : ParamVal ) -> Result < Self , FromParameterValueError > {
42- if let ParamVal :: Bool ( val) = parameter_val {
43- Ok ( val)
44- } else {
45- Err ( FromParameterValueError :: UnexpectedType )
46- }
47- }
48- }
49-
50- impl FromParameterValue for String {
51- fn from_parameter_value ( parameter_val : ParamVal ) -> Result < Self , FromParameterValueError > {
52- if let ParamVal :: Str ( val) = parameter_val {
53- Ok ( val)
54- } else {
55- Err ( FromParameterValueError :: UnexpectedType )
56- }
57- }
58- }
4+ use core:: convert:: TryFrom ;
5+ use core:: convert:: TryInto ;
596
607/// An error that occurs as a result of a failed conversion of a `Parameters`
618/// struct
629#[ derive( Debug ) ]
63- pub enum FromParametersError {
10+ pub enum FromParametersError < ' a > {
6411 /// Indicates the error ocurred because a value for a specified parameter
6512 /// was not supplied.
66- MissingParam { param_name : ParamKey } ,
13+ MissingParam { param_key : & ' a ParamKey } ,
6714
6815 /// Indicates the error occurred because the value that was attempted for conversion
6916 /// was for the incorrect type.
@@ -74,35 +21,73 @@ pub enum FromParametersError {
7421pub trait FromParameters : Sized {
7522 /// Try to create a type from a parameter struct (`params`) for a paramter
7623 /// of a specific name (`param_name`).
77- fn from_parameters (
24+ fn from_parameters < ' a > (
7825 params : & mut Parameters ,
79- param_name : & ParamKey ,
80- ) -> Result < Self , FromParametersError > ;
26+ param_key : & ' a ParamKey ,
27+ ) -> Result < Self , FromParametersError < ' a > > ;
8128}
8229
83- impl < T : FromParameterValue > FromParameters for T {
84- fn from_parameters (
30+ impl < T > FromParameters for T
31+ where
32+ T : TryFrom < ParamVal > ,
33+ {
34+ fn from_parameters < ' a > (
8535 params : & mut Parameters ,
86- param_name : & ParamKey ,
87- ) -> Result < Self , FromParametersError > {
88- if let Some ( parameter_val) = params. remove ( & param_name. to_owned ( ) . into ( ) ) {
89- T :: from_parameter_value ( parameter_val) . map_err ( |err| match err {
90- FromParameterValueError :: UnexpectedType => FromParametersError :: UnexpectedType ,
91- } )
36+ param_key : & ' a ParamKey ,
37+ ) -> Result < Self , FromParametersError < ' a > > {
38+ if let Some ( param_val) = params. remove ( param_key) {
39+ T :: try_from ( param_val) . map_err ( |_| FromParametersError :: UnexpectedType )
9240 } else {
93- Err ( FromParametersError :: MissingParam {
94- param_name : param_name. clone ( ) ,
95- } )
41+ Err ( FromParametersError :: MissingParam { param_key } )
9642 }
9743 }
9844}
9945
100- impl < T : FromParameters > FromParameters for Option < T > {
101- fn from_parameters (
46+ impl FromParameters for Option < bool > {
47+ fn from_parameters < ' a > (
10248 params : & mut Parameters ,
103- param_name : & ParamKey ,
104- ) -> Result < Self , FromParametersError > {
105- Ok ( T :: from_parameters ( params, param_name) . ok ( ) )
49+ param_key : & ' a ParamKey ,
50+ ) -> Result < Self , FromParametersError < ' a > > {
51+ Ok ( params
52+ . remove ( param_key)
53+ . map ( |val| val. try_into ( ) . ok ( ) )
54+ . flatten ( ) )
55+ }
56+ }
57+
58+ impl FromParameters for Option < i64 > {
59+ fn from_parameters < ' a > (
60+ params : & mut Parameters ,
61+ param_key : & ' a ParamKey ,
62+ ) -> Result < Self , FromParametersError < ' a > > {
63+ Ok ( params
64+ . remove ( param_key)
65+ . map ( |val| val. try_into ( ) . ok ( ) )
66+ . flatten ( ) )
67+ }
68+ }
69+
70+ impl FromParameters for Option < f64 > {
71+ fn from_parameters < ' a > (
72+ params : & mut Parameters ,
73+ param_key : & ' a ParamKey ,
74+ ) -> Result < Self , FromParametersError < ' a > > {
75+ Ok ( params
76+ . remove ( param_key)
77+ . map ( |val| val. try_into ( ) . ok ( ) )
78+ . flatten ( ) )
79+ }
80+ }
81+
82+ impl FromParameters for Option < String > {
83+ fn from_parameters < ' a > (
84+ params : & mut Parameters ,
85+ param_key : & ' a ParamKey ,
86+ ) -> Result < Self , FromParametersError < ' a > > {
87+ Ok ( params
88+ . remove ( param_key)
89+ . map ( |val| val. try_into ( ) . ok ( ) )
90+ . flatten ( ) )
10691 }
10792}
10893
@@ -116,16 +101,18 @@ mod tests {
116101 fn from_parameters_bool ( ) {
117102 let mut params = Parameters :: default ( ) ;
118103 params. insert ( "foo" . into ( ) , ParamVal :: Bool ( true ) ) ;
119- let output = bool:: from_parameters ( & mut params, & "foo" . into ( ) ) ;
104+ let param_key = "foo" . into ( ) ;
105+ let output = bool:: from_parameters ( & mut params, & param_key) ;
120106
121107 assert_eq ! ( output. unwrap( ) , true ) ;
122108 }
123109
124110 #[ test]
125111 fn from_parameters_str ( ) {
126112 let mut params = Parameters :: default ( ) ;
127- params. insert ( "foo" . into ( ) , ParamVal :: UnsignedInt ( 1 ) ) ;
128- let output = u64:: from_parameters ( & mut params, & "foo" . into ( ) ) ;
113+ params. insert ( "foo" . into ( ) , ParamVal :: Int ( 1 ) ) ;
114+ let param_key = "foo" . into ( ) ;
115+ let output = i64:: from_parameters ( & mut params, & param_key) ;
129116
130117 assert_eq ! ( output. unwrap( ) , 1 ) ;
131118 }
@@ -134,7 +121,8 @@ mod tests {
134121 fn from_parameters_int ( ) {
135122 let mut params = Parameters :: default ( ) ;
136123 params. insert ( "foo" . into ( ) , ParamVal :: Str ( "bar" . into ( ) ) ) ;
137- let output = String :: from_parameters ( & mut params, & "foo" . into ( ) ) ;
124+ let param_key = "foo" . into ( ) ;
125+ let output = String :: from_parameters ( & mut params, & param_key) ;
138126
139127 let right: String = "bar" . into ( ) ;
140128 assert_eq ! ( output. unwrap( ) , right) ;
@@ -144,33 +132,36 @@ mod tests {
144132 fn from_parameters_bool_option ( ) {
145133 let mut params = Parameters :: default ( ) ;
146134 params. insert ( "foo" . into ( ) , ParamVal :: Bool ( true ) ) ;
147- let output = Option :: < bool > :: from_parameters ( & mut params, & "foo" . into ( ) ) ;
135+ let param_key = "foo" . into ( ) ;
136+ let output = Option :: < bool > :: from_parameters ( & mut params, & param_key) ;
148137
149138 assert_eq ! ( output. unwrap( ) , Some ( true ) ) ;
150- let no_output = Option :: < bool > :: from_parameters ( & mut params, & "foo" . into ( ) ) ;
139+ let no_output = Option :: < bool > :: from_parameters ( & mut params, & param_key ) ;
151140 assert_eq ! ( no_output. unwrap( ) , None ) ;
152141 }
153142
154143 #[ test]
155144 fn from_parameters_str_option ( ) {
156145 let mut params = Parameters :: default ( ) ;
157- params. insert ( "foo" . into ( ) , ParamVal :: UnsignedInt ( 1 ) ) ;
158- let output = Option :: < u64 > :: from_parameters ( & mut params, & "foo" . into ( ) ) ;
146+ params. insert ( "foo" . into ( ) , ParamVal :: Int ( 1 ) ) ;
147+ let param_key = "foo" . into ( ) ;
148+ let output = Option :: < i64 > :: from_parameters ( & mut params, & param_key) ;
159149
160150 assert_eq ! ( output. unwrap( ) , Some ( 1 ) ) ;
161- let no_output = Option :: < u64 > :: from_parameters ( & mut params, & "foo" . into ( ) ) ;
151+ let no_output = Option :: < i64 > :: from_parameters ( & mut params, & param_key ) ;
162152 assert_eq ! ( no_output. unwrap( ) , None ) ;
163153 }
164154
165155 #[ test]
166156 fn from_parameters_int_option ( ) {
167157 let mut params = Parameters :: default ( ) ;
168- params. insert ( "foo" . into ( ) , ParamVal :: Str ( "bar" . into ( ) ) ) ;
169- let output = Option :: < String > :: from_parameters ( & mut params, & "foo" . into ( ) ) ;
158+ params. insert ( "foo" . into ( ) , "bar" . into ( ) ) ;
159+ let param_key = "foo" . into ( ) ;
160+ let output = Option :: < String > :: from_parameters ( & mut params, & param_key) ;
170161
171162 let right: String = "bar" . into ( ) ;
172163 assert_eq ! ( output. unwrap( ) , Some ( right) ) ;
173- let no_output = Option :: < String > :: from_parameters ( & mut params, & "foo" . into ( ) ) ;
164+ let no_output = Option :: < String > :: from_parameters ( & mut params, & param_key ) ;
174165 assert_eq ! ( no_output. unwrap( ) , None ) ;
175166 }
176167}
0 commit comments