1
- mod utils;
2
1
mod url_builder;
2
+ mod utils;
3
3
4
- use wasm_bindgen:: prelude:: * ;
5
- use readap:: { DdsDataset , DodsDataset , DasAttribute , parse_das_attributes} ;
6
- use readap:: data:: { DataType , DataValue } ;
7
4
use js_sys:: { Array , Object , Reflect } ;
5
+ use readap:: data:: { DataType , DataValue } ;
6
+ use readap:: { parse_das_attributes, DasAttribute , DdsDataset , DodsDataset } ;
7
+ use wasm_bindgen:: prelude:: * ;
8
8
9
9
pub use url_builder:: UrlBuilder ;
10
10
11
11
#[ wasm_bindgen]
12
12
pub fn parse_dds ( content : & str ) -> Result < JsValue , JsValue > {
13
13
utils:: set_panic_hook ( ) ;
14
-
14
+
15
15
match DdsDataset :: from_bytes ( content) {
16
16
Ok ( dataset) => {
17
17
let obj = Object :: new ( ) ;
18
-
18
+
19
19
// Set dataset name
20
20
Reflect :: set ( & obj, & "name" . into ( ) , & JsValue :: from_str ( & dataset. name ) )
21
21
. map_err ( |_| JsValue :: from_str ( "Failed to set name" ) ) ?;
22
-
22
+
23
23
// Convert variables
24
24
let vars_array = Array :: new ( ) ;
25
25
for value in & dataset. values {
@@ -28,36 +28,36 @@ pub fn parse_dds(content: &str) -> Result<JsValue, JsValue> {
28
28
}
29
29
Reflect :: set ( & obj, & "values" . into ( ) , & vars_array)
30
30
. map_err ( |_| JsValue :: from_str ( "Failed to set values" ) ) ?;
31
-
31
+
32
32
// Add utility methods as properties
33
33
let variables = Array :: new ( ) ;
34
34
for var_name in dataset. list_variables ( ) {
35
35
variables. push ( & JsValue :: from_str ( & var_name) ) ;
36
36
}
37
37
Reflect :: set ( & obj, & "variables" . into ( ) , & variables)
38
38
. map_err ( |_| JsValue :: from_str ( "Failed to set variables list" ) ) ?;
39
-
39
+
40
40
let coordinates = Array :: new ( ) ;
41
41
for coord_name in dataset. list_coordinates ( ) {
42
42
coordinates. push ( & JsValue :: from_str ( & coord_name) ) ;
43
43
}
44
44
Reflect :: set ( & obj, & "coordinates" . into ( ) , & coordinates)
45
45
. map_err ( |_| JsValue :: from_str ( "Failed to set coordinates list" ) ) ?;
46
-
46
+
47
47
Ok ( obj. into ( ) )
48
48
}
49
- Err ( e) => Err ( JsValue :: from_str ( & format ! ( "Parse error: {}" , e) ) )
49
+ Err ( e) => Err ( JsValue :: from_str ( & format ! ( "Parse error: {}" , e) ) ) ,
50
50
}
51
51
}
52
52
53
53
#[ wasm_bindgen]
54
54
pub fn parse_das ( content : & str ) -> Result < JsValue , JsValue > {
55
55
utils:: set_panic_hook ( ) ;
56
-
56
+
57
57
match parse_das_attributes ( content) {
58
58
Ok ( attributes) => {
59
59
let obj = Object :: new ( ) ;
60
-
60
+
61
61
for ( var_name, var_attrs) in attributes {
62
62
let var_obj = Object :: new ( ) ;
63
63
for ( attr_name, attr) in var_attrs {
@@ -68,129 +68,149 @@ pub fn parse_das(content: &str) -> Result<JsValue, JsValue> {
68
68
Reflect :: set ( & obj, & JsValue :: from_str ( & var_name) , & var_obj)
69
69
. map_err ( |_| JsValue :: from_str ( "Failed to set variable" ) ) ?;
70
70
}
71
-
71
+
72
72
Ok ( obj. into ( ) )
73
73
}
74
- Err ( e) => Err ( JsValue :: from_str ( & format ! ( "Parse error: {}" , e) ) )
74
+ Err ( e) => Err ( JsValue :: from_str ( & format ! ( "Parse error: {}" , e) ) ) ,
75
75
}
76
76
}
77
77
78
78
#[ wasm_bindgen]
79
79
pub fn parse_dods ( bytes : & [ u8 ] ) -> Result < JsValue , JsValue > {
80
80
utils:: set_panic_hook ( ) ;
81
-
81
+
82
82
match DodsDataset :: from_bytes ( bytes) {
83
83
Ok ( dods) => {
84
84
let obj = Object :: new ( ) ;
85
-
85
+
86
86
// Set dataset
87
87
let dataset_obj = parse_dds ( & format ! ( "{:?}" , dods. dds) ) ?; // This is a placeholder - would need proper DDS serialization
88
88
Reflect :: set ( & obj, & "dataset" . into ( ) , & dataset_obj)
89
89
. map_err ( |_| JsValue :: from_str ( "Failed to set dataset" ) ) ?;
90
-
90
+
91
91
// Set variables list
92
92
let variables = Array :: new ( ) ;
93
93
for var_name in dods. variables ( ) {
94
94
variables. push ( & JsValue :: from_str ( & var_name) ) ;
95
95
}
96
96
Reflect :: set ( & obj, & "variables" . into ( ) , & variables)
97
97
. map_err ( |_| JsValue :: from_str ( "Failed to set variables" ) ) ?;
98
-
98
+
99
99
Ok ( obj. into ( ) )
100
100
}
101
- Err ( e) => Err ( JsValue :: from_str ( & format ! ( "Parse error: {}" , e) ) )
101
+ Err ( e) => Err ( JsValue :: from_str ( & format ! ( "Parse error: {}" , e) ) ) ,
102
102
}
103
103
}
104
104
105
105
// Helper functions
106
106
fn dds_value_to_js ( value : & readap:: DdsValue ) -> Result < JsValue , JsValue > {
107
107
let obj = Object :: new ( ) ;
108
-
108
+
109
109
Reflect :: set ( & obj, & "name" . into ( ) , & JsValue :: from_str ( & value. name ( ) ) )
110
110
. map_err ( |_| JsValue :: from_str ( "Failed to set value name" ) ) ?;
111
-
111
+
112
112
match value {
113
113
readap:: DdsValue :: Array ( array) => {
114
114
Reflect :: set ( & obj, & "type" . into ( ) , & JsValue :: from_str ( "Array" ) )
115
115
. map_err ( |_| JsValue :: from_str ( "Failed to set type" ) ) ?;
116
-
117
- Reflect :: set ( & obj, & "dataType" . into ( ) , & JsValue :: from_str ( & data_type_to_string ( & array. data_type ) ) )
118
- . map_err ( |_| JsValue :: from_str ( "Failed to set data type" ) ) ?;
119
-
116
+
117
+ Reflect :: set (
118
+ & obj,
119
+ & "dataType" . into ( ) ,
120
+ & JsValue :: from_str ( & data_type_to_string ( & array. data_type ) ) ,
121
+ )
122
+ . map_err ( |_| JsValue :: from_str ( "Failed to set data type" ) ) ?;
123
+
120
124
let coords_array = Array :: new ( ) ;
121
125
for ( coord_name, coord_size) in & array. coords {
122
126
let coord_obj = Object :: new ( ) ;
123
127
Reflect :: set ( & coord_obj, & "name" . into ( ) , & JsValue :: from_str ( coord_name) )
124
128
. map_err ( |_| JsValue :: from_str ( "Failed to set coord name" ) ) ?;
125
- Reflect :: set ( & coord_obj, & "size" . into ( ) , & JsValue :: from_f64 ( * coord_size as f64 ) )
126
- . map_err ( |_| JsValue :: from_str ( "Failed to set coord size" ) ) ?;
129
+ Reflect :: set (
130
+ & coord_obj,
131
+ & "size" . into ( ) ,
132
+ & JsValue :: from_f64 ( * coord_size as f64 ) ,
133
+ )
134
+ . map_err ( |_| JsValue :: from_str ( "Failed to set coord size" ) ) ?;
127
135
coords_array. push ( & coord_obj) ;
128
136
}
129
137
Reflect :: set ( & obj, & "coordinates" . into ( ) , & coords_array)
130
138
. map_err ( |_| JsValue :: from_str ( "Failed to set coordinates" ) ) ?;
131
- } ,
139
+ }
132
140
readap:: DdsValue :: Grid ( grid) => {
133
141
Reflect :: set ( & obj, & "type" . into ( ) , & JsValue :: from_str ( "Grid" ) )
134
142
. map_err ( |_| JsValue :: from_str ( "Failed to set type" ) ) ?;
135
-
136
- Reflect :: set ( & obj, & "dataType" . into ( ) , & JsValue :: from_str ( & data_type_to_string ( & grid. array . data_type ) ) )
137
- . map_err ( |_| JsValue :: from_str ( "Failed to set data type" ) ) ?;
138
-
143
+
144
+ Reflect :: set (
145
+ & obj,
146
+ & "dataType" . into ( ) ,
147
+ & JsValue :: from_str ( & data_type_to_string ( & grid. array . data_type ) ) ,
148
+ )
149
+ . map_err ( |_| JsValue :: from_str ( "Failed to set data type" ) ) ?;
150
+
139
151
let coords_array = Array :: new ( ) ;
140
152
for coord in & grid. coords {
141
153
let coord_obj = Object :: new ( ) ;
142
154
Reflect :: set ( & coord_obj, & "name" . into ( ) , & JsValue :: from_str ( & coord. name ) )
143
155
. map_err ( |_| JsValue :: from_str ( "Failed to set coord name" ) ) ?;
144
- Reflect :: set ( & coord_obj, & "size" . into ( ) , & JsValue :: from_f64 ( coord. array_length ( ) as f64 ) )
145
- . map_err ( |_| JsValue :: from_str ( "Failed to set coord size" ) ) ?;
156
+ Reflect :: set (
157
+ & coord_obj,
158
+ & "size" . into ( ) ,
159
+ & JsValue :: from_f64 ( coord. array_length ( ) as f64 ) ,
160
+ )
161
+ . map_err ( |_| JsValue :: from_str ( "Failed to set coord size" ) ) ?;
146
162
coords_array. push ( & coord_obj) ;
147
163
}
148
164
Reflect :: set ( & obj, & "coordinates" . into ( ) , & coords_array)
149
165
. map_err ( |_| JsValue :: from_str ( "Failed to set coordinates" ) ) ?;
150
- } ,
166
+ }
151
167
readap:: DdsValue :: Structure ( structure) => {
152
168
Reflect :: set ( & obj, & "type" . into ( ) , & JsValue :: from_str ( "Structure" ) )
153
169
. map_err ( |_| JsValue :: from_str ( "Failed to set type" ) ) ?;
154
-
170
+
155
171
let fields_array = Array :: new ( ) ;
156
172
for field in & structure. fields {
157
173
let field_obj = dds_value_to_js ( field) ?;
158
174
fields_array. push ( & field_obj) ;
159
175
}
160
176
Reflect :: set ( & obj, & "fields" . into ( ) , & fields_array)
161
177
. map_err ( |_| JsValue :: from_str ( "Failed to set fields" ) ) ?;
162
- } ,
178
+ }
163
179
readap:: DdsValue :: Sequence ( sequence) => {
164
180
Reflect :: set ( & obj, & "type" . into ( ) , & JsValue :: from_str ( "Sequence" ) )
165
181
. map_err ( |_| JsValue :: from_str ( "Failed to set type" ) ) ?;
166
-
182
+
167
183
let fields_array = Array :: new ( ) ;
168
184
for field in & sequence. fields {
169
185
let field_obj = dds_value_to_js ( field) ?;
170
186
fields_array. push ( & field_obj) ;
171
187
}
172
188
Reflect :: set ( & obj, & "fields" . into ( ) , & fields_array)
173
189
. map_err ( |_| JsValue :: from_str ( "Failed to set fields" ) ) ?;
174
- } ,
190
+ }
175
191
}
176
-
192
+
177
193
Ok ( obj. into ( ) )
178
194
}
179
195
180
196
fn das_attribute_to_js ( attr : & DasAttribute ) -> Result < JsValue , JsValue > {
181
197
let obj = Object :: new ( ) ;
182
-
198
+
183
199
Reflect :: set ( & obj, & "name" . into ( ) , & JsValue :: from_str ( & attr. name ) )
184
200
. map_err ( |_| JsValue :: from_str ( "Failed to set attribute name" ) ) ?;
185
-
186
- Reflect :: set ( & obj, & "dataType" . into ( ) , & JsValue :: from_str ( & data_type_to_string ( & attr. data_type ) ) )
187
- . map_err ( |_| JsValue :: from_str ( "Failed to set attribute data type" ) ) ?;
188
-
201
+
202
+ Reflect :: set (
203
+ & obj,
204
+ & "dataType" . into ( ) ,
205
+ & JsValue :: from_str ( & data_type_to_string ( & attr. data_type ) ) ,
206
+ )
207
+ . map_err ( |_| JsValue :: from_str ( "Failed to set attribute data type" ) ) ?;
208
+
189
209
// Set the actual value
190
210
let value = data_value_to_js ( & attr. value ) ?;
191
211
Reflect :: set ( & obj, & "value" . into ( ) , & value)
192
212
. map_err ( |_| JsValue :: from_str ( "Failed to set attribute value" ) ) ?;
193
-
213
+
194
214
Ok ( obj. into ( ) )
195
215
}
196
216
@@ -221,4 +241,4 @@ fn data_type_to_string(data_type: &DataType) -> String {
221
241
DataType :: String => "String" . to_string ( ) ,
222
242
DataType :: URL => "URL" . to_string ( ) ,
223
243
}
224
- }
244
+ }
0 commit comments