@@ -34,13 +34,41 @@ impl DasAttribute {
34
34
let ( input, _) = tag ( ";" ) ( input) ?;
35
35
36
36
let value = match data_type {
37
- DataType :: Byte => DataValue :: Byte ( raw_value. parse :: < i8 > ( ) . unwrap ( ) ) ,
38
- DataType :: Int16 => DataValue :: Int16 ( raw_value. parse :: < i16 > ( ) . unwrap ( ) ) ,
39
- DataType :: UInt16 => DataValue :: UInt16 ( raw_value. parse :: < u16 > ( ) . unwrap ( ) ) ,
40
- DataType :: Int32 => DataValue :: Int32 ( raw_value. parse :: < i32 > ( ) . unwrap ( ) ) ,
41
- DataType :: UInt32 => DataValue :: UInt32 ( raw_value. parse :: < u32 > ( ) . unwrap ( ) ) ,
42
- DataType :: Float32 => DataValue :: Float32 ( raw_value. parse :: < f32 > ( ) . unwrap ( ) ) ,
43
- DataType :: Float64 => DataValue :: Float64 ( raw_value. parse :: < f64 > ( ) . unwrap ( ) ) ,
37
+ DataType :: Byte => {
38
+ let parsed = raw_value. parse :: < i8 > ( )
39
+ . map_err ( |_| nom:: Err :: Error ( nom:: error:: Error :: new ( input, nom:: error:: ErrorKind :: Digit ) ) ) ?;
40
+ DataValue :: Byte ( parsed)
41
+ }
42
+ DataType :: Int16 => {
43
+ let parsed = raw_value. parse :: < i16 > ( )
44
+ . map_err ( |_| nom:: Err :: Error ( nom:: error:: Error :: new ( input, nom:: error:: ErrorKind :: Digit ) ) ) ?;
45
+ DataValue :: Int16 ( parsed)
46
+ }
47
+ DataType :: UInt16 => {
48
+ let parsed = raw_value. parse :: < u16 > ( )
49
+ . map_err ( |_| nom:: Err :: Error ( nom:: error:: Error :: new ( input, nom:: error:: ErrorKind :: Digit ) ) ) ?;
50
+ DataValue :: UInt16 ( parsed)
51
+ }
52
+ DataType :: Int32 => {
53
+ let parsed = raw_value. parse :: < i32 > ( )
54
+ . map_err ( |_| nom:: Err :: Error ( nom:: error:: Error :: new ( input, nom:: error:: ErrorKind :: Digit ) ) ) ?;
55
+ DataValue :: Int32 ( parsed)
56
+ }
57
+ DataType :: UInt32 => {
58
+ let parsed = raw_value. parse :: < u32 > ( )
59
+ . map_err ( |_| nom:: Err :: Error ( nom:: error:: Error :: new ( input, nom:: error:: ErrorKind :: Digit ) ) ) ?;
60
+ DataValue :: UInt32 ( parsed)
61
+ }
62
+ DataType :: Float32 => {
63
+ let parsed = raw_value. parse :: < f32 > ( )
64
+ . map_err ( |_| nom:: Err :: Error ( nom:: error:: Error :: new ( input, nom:: error:: ErrorKind :: Float ) ) ) ?;
65
+ DataValue :: Float32 ( parsed)
66
+ }
67
+ DataType :: Float64 => {
68
+ let parsed = raw_value. parse :: < f64 > ( )
69
+ . map_err ( |_| nom:: Err :: Error ( nom:: error:: Error :: new ( input, nom:: error:: ErrorKind :: Float ) ) ) ?;
70
+ DataValue :: Float64 ( parsed)
71
+ }
44
72
DataType :: String => DataValue :: String ( raw_value. replace ( "\" " , "" ) ) ,
45
73
DataType :: URL => DataValue :: URL ( raw_value. replace ( "\" " , "" ) ) ,
46
74
} ;
@@ -131,9 +159,9 @@ mod tests {
131
159
use super :: { parse_das_attributes, parse_das_variable, DasAttribute } ;
132
160
133
161
#[ test]
134
- fn parse_attribute ( ) {
162
+ fn parse_attribute ( ) -> Result < ( ) , Box < dyn std :: error :: Error > > {
135
163
let input = r#"String long_name "Longitude";"# ;
136
- let ( _, string_value) = DasAttribute :: parse ( input) . unwrap ( ) ;
164
+ let ( _, string_value) = DasAttribute :: parse ( input) ? ;
137
165
assert_eq ! ( string_value. data_type, DataType :: String ) ;
138
166
assert_eq ! ( string_value. name, "long_name" ) ;
139
167
let value = if let DataValue :: String ( s) = string_value. value {
@@ -144,7 +172,7 @@ mod tests {
144
172
assert_eq ! ( value, "Longitude" ) ;
145
173
146
174
let input = "Int32 _FillValue 999;" ;
147
- let ( _, int_value) = DasAttribute :: parse ( input) . unwrap ( ) ;
175
+ let ( _, int_value) = DasAttribute :: parse ( input) ? ;
148
176
assert_eq ! ( int_value. data_type, DataType :: Int32 ) ;
149
177
assert_eq ! ( int_value. name, "_FillValue" ) ;
150
178
let value = if let DataValue :: Int32 ( i) = int_value. value {
@@ -155,7 +183,7 @@ mod tests {
155
183
assert_eq ! ( value, 999 ) ;
156
184
157
185
let input = "Float32 _FillValue 999.0;" ;
158
- let ( _, float_value) = DasAttribute :: parse ( input) . unwrap ( ) ;
186
+ let ( _, float_value) = DasAttribute :: parse ( input) ? ;
159
187
assert_eq ! ( float_value. data_type, DataType :: Float32 ) ;
160
188
assert_eq ! ( float_value. name, "_FillValue" ) ;
161
189
let value = if let DataValue :: Float32 ( f) = float_value. value {
@@ -164,10 +192,11 @@ mod tests {
164
192
0.0
165
193
} ;
166
194
assert ! ( ( value - 999.0 ) . abs( ) < 0.0001 ) ;
195
+ Ok ( ( ) )
167
196
}
168
197
169
198
#[ test]
170
- fn parse_variable ( ) {
199
+ fn parse_variable ( ) -> Result < ( ) , Box < dyn std :: error :: Error > > {
171
200
let input = r#" spectral_wave_density {
172
201
String long_name "Spectral Wave Density";
173
202
String short_name "swden";
@@ -176,7 +205,7 @@ mod tests {
176
205
Float32 _FillValue 999.0;
177
206
}"# ;
178
207
179
- let ( _, ( name, attrs) ) = parse_das_variable ( input) . unwrap ( ) ;
208
+ let ( _, ( name, attrs) ) = parse_das_variable ( input) ? ;
180
209
assert_eq ! ( name, "spectral_wave_density" ) ;
181
210
assert_eq ! ( attrs. len( ) , 5 ) ;
182
211
assert_eq ! ( attrs[ "long_name" ] . data_type, DataType :: String ) ;
@@ -192,10 +221,11 @@ mod tests {
192
221
} else {
193
222
false
194
223
} ) ;
224
+ Ok ( ( ) )
195
225
}
196
226
197
227
#[ test]
198
- fn parse_das ( ) {
228
+ fn parse_das ( ) -> Result < ( ) , Box < dyn std :: error :: Error > > {
199
229
let input = r#"Attributes {
200
230
time {
201
231
String long_name "Epoch Time";
@@ -210,10 +240,29 @@ mod tests {
210
240
String units "Hz";
211
241
}
212
242
}"# ;
213
- let attrs = parse_das_attributes ( input) . unwrap ( ) ;
243
+ let attrs = parse_das_attributes ( input) ? ;
214
244
215
245
assert_eq ! ( attrs. len( ) , 2 ) ;
216
246
assert ! ( attrs. contains_key( "time" ) ) ;
217
247
assert ! ( attrs. contains_key( "frequency" ) ) ;
248
+ Ok ( ( ) )
249
+ }
250
+
251
+ #[ test]
252
+ fn parse_invalid_attribute_values ( ) {
253
+ // Test invalid integer
254
+ let input = "Int32 _FillValue not_a_number;" ;
255
+ let result = DasAttribute :: parse ( input) ;
256
+ assert ! ( result. is_err( ) ) ;
257
+
258
+ // Test invalid float
259
+ let input = "Float32 _FillValue invalid_float;" ;
260
+ let result = DasAttribute :: parse ( input) ;
261
+ assert ! ( result. is_err( ) ) ;
262
+
263
+ // Test invalid byte
264
+ let input = "Byte quality_flag 999;" ; // Out of range for i8
265
+ let result = DasAttribute :: parse ( input) ;
266
+ assert ! ( result. is_err( ) ) ;
218
267
}
219
268
}
0 commit comments