1
1
use {
2
- super :: { Convert , Value , ValueError } ,
2
+ super :: { Convert , Value , ValueError , ValueType } ,
3
3
crate :: { Error , Result } ,
4
4
chrono:: { NaiveDate , NaiveDateTime , NaiveTime , ParseError } ,
5
5
std:: convert:: TryInto ,
@@ -13,6 +13,13 @@ pub trait CastWithRules<Output> {
13
13
fn cast_with_rule ( self , rule : Self ) -> Result < Output > ;
14
14
}
15
15
16
+ fn failed_cast ( value : & Value , value_type : ValueType ) -> Error {
17
+ Error :: Value ( ValueError :: FailedCast ( value. clone ( ) , value_type) )
18
+ }
19
+ fn unimplemented_cast ( value : & Value , value_type : ValueType ) -> Error {
20
+ Error :: Value ( ValueError :: FailedCast ( value. clone ( ) . into ( ) , value_type) )
21
+ }
22
+
16
23
// Cores
17
24
impl Cast < bool > for Value {
18
25
fn cast ( self ) -> Result < bool > {
@@ -21,24 +28,24 @@ impl Cast<bool> for Value {
21
28
Value :: I64 ( value) => match value {
22
29
1 => true ,
23
30
0 => false ,
24
- _ => return Err ( ValueError :: ImpossibleCast . into ( ) ) ,
31
+ _ => return Err ( failed_cast ( & self , ValueType :: Bool ) ) ,
25
32
} ,
26
33
Value :: F64 ( value) => {
27
34
if value. eq ( & 1.0 ) {
28
35
true
29
36
} else if value. eq ( & 0.0 ) {
30
37
false
31
38
} else {
32
- return Err ( ValueError :: ImpossibleCast . into ( ) ) ;
39
+ return Err ( failed_cast ( & self , ValueType :: Bool ) ) ;
33
40
}
34
41
}
35
42
Value :: Str ( value) => match value. to_uppercase ( ) . as_str ( ) {
36
43
"TRUE" => true ,
37
44
"FALSE" => false ,
38
45
_ => return Err ( ValueError :: ImpossibleCast . into ( ) ) ,
39
46
} ,
40
- Value :: Null => return Err ( ValueError :: ImpossibleCast . into ( ) ) ,
41
- _ => return Err ( Error :: Value ( ValueError :: UnimplementedCast ) ) ,
47
+ Value :: Null => return Err ( failed_cast ( & self , ValueType :: Bool ) ) ,
48
+ _ => return Err ( unimplemented_cast ( & self , ValueType :: Bool ) ) ,
42
49
} )
43
50
}
44
51
}
@@ -54,13 +61,15 @@ impl Cast<u64> for Value {
54
61
}
55
62
}
56
63
Value :: U64 ( value) => value,
57
- Value :: I64 ( value) => value. try_into ( ) . map_err ( |_| ValueError :: ImpossibleCast ) ?,
64
+ Value :: I64 ( value) => value
65
+ . try_into ( )
66
+ . map_err ( |_| failed_cast ( & self , ValueType :: U64 ) ) ?,
58
67
Value :: F64 ( value) => ( value. trunc ( ) as i64 )
59
68
. try_into ( )
60
- . map_err ( |_| ValueError :: ImpossibleCast ) ?,
69
+ . map_err ( |_| failed_cast ( & self , ValueType :: U64 ) ) ?,
61
70
Value :: Str ( value) => lexical:: parse ( value) . map_err ( |_| ValueError :: ImpossibleCast ) ?,
62
- Value :: Null => return Err ( ValueError :: ImpossibleCast . into ( ) ) ,
63
- _ => return Err ( Error :: Value ( ValueError :: UnimplementedCast ) ) ,
71
+ Value :: Null => return Err ( failed_cast ( & self , ValueType :: U64 ) ) ,
72
+ _ => return Err ( unimplemented_cast ( & self , ValueType :: U64 ) ) ,
64
73
} )
65
74
}
66
75
}
@@ -75,12 +84,14 @@ impl Cast<i64> for Value {
75
84
0
76
85
}
77
86
}
78
- Value :: U64 ( value) => value. try_into ( ) . map_err ( |_| ValueError :: ImpossibleCast ) ?,
87
+ Value :: U64 ( value) => value
88
+ . try_into ( )
89
+ . map_err ( |_| failed_cast ( & self , ValueType :: I64 ) ) ?,
79
90
Value :: I64 ( value) => value,
80
91
Value :: F64 ( value) => value. trunc ( ) as i64 ,
81
92
Value :: Str ( value) => lexical:: parse ( value) . map_err ( |_| ValueError :: ImpossibleCast ) ?,
82
- Value :: Null => return Err ( ValueError :: ImpossibleCast . into ( ) ) ,
83
- _ => return Err ( Error :: Value ( ValueError :: UnimplementedCast ) ) ,
93
+ Value :: Null => return Err ( failed_cast ( & self , ValueType :: I64 ) ) ,
94
+ _ => return Err ( unimplemented_cast ( & self , ValueType :: I64 ) ) ,
84
95
} )
85
96
}
86
97
}
@@ -101,8 +112,8 @@ impl Cast<f64> for Value {
101
112
Value :: Str ( value) => {
102
113
fast_float:: parse ( value) . map_err ( |_| ValueError :: ImpossibleCast ) ?
103
114
}
104
- Value :: Null => return Err ( ValueError :: ImpossibleCast . into ( ) ) ,
105
- _ => return Err ( Error :: Value ( ValueError :: UnimplementedCast ) ) ,
115
+ Value :: Null => return Err ( failed_cast ( & self , ValueType :: F64 ) ) ,
116
+ _ => return Err ( unimplemented_cast ( & self , ValueType :: F64 ) ) ,
106
117
} )
107
118
}
108
119
}
@@ -116,7 +127,7 @@ impl Cast<String> for Value {
116
127
Value :: Str ( value) => value,
117
128
Value :: Timestamp ( value) => lexical:: to_string ( value) ,
118
129
Value :: Null => String :: from ( "NULL" ) ,
119
- _ => return Err ( Error :: Value ( ValueError :: UnimplementedCast ) ) ,
130
+ _ => return Err ( unimplemented_cast ( & self , ValueType :: Str ) ) ,
120
131
} )
121
132
}
122
133
}
0 commit comments