@@ -14,7 +14,7 @@ use extend::ext;
1414use js_sys:: { Array , ArrayBuffer , Function , Object , Reflect , Uint8Array , JSON } ;
1515use perspective_client:: config:: * ;
1616use perspective_client:: proto:: * ;
17- use perspective_client:: { assert_table_api, TableData , UpdateData , UpdateOptions } ;
17+ use perspective_client:: { assert_table_api, TableData , TableReadFormat , UpdateData , UpdateOptions } ;
1818use wasm_bindgen:: convert:: TryFromJsValue ;
1919use wasm_bindgen:: prelude:: * ;
2020use wasm_bindgen_futures:: spawn_local;
@@ -45,9 +45,9 @@ impl Vec<(String, ColumnType)> {
4545
4646#[ ext]
4747pub ( crate ) impl TableData {
48- fn from_js_value ( value : & JsValue ) -> ApiResult < TableData > {
48+ fn from_js_value ( value : & JsValue , format : Option < TableReadFormat > ) -> ApiResult < TableData > {
4949 let err_fn = || JsValue :: from ( format ! ( "Failed to construct Table {:?}" , value) ) ;
50- if let Some ( result) = UpdateData :: from_js_value_partial ( value) ? {
50+ if let Some ( result) = UpdateData :: from_js_value_partial ( value, format ) ? {
5151 Ok ( result. into ( ) )
5252 } else if value. is_instance_of :: < Object > ( ) && Reflect :: has ( value, & "__get_model" . into ( ) ) ? {
5353 let val = Reflect :: get ( value, & "__get_model" . into ( ) ) ?
@@ -87,19 +87,53 @@ pub(crate) impl TableData {
8787
8888#[ ext]
8989pub ( crate ) impl UpdateData {
90- fn from_js_value_partial ( value : & JsValue ) -> ApiResult < Option < UpdateData > > {
90+ fn from_js_value_partial (
91+ value : & JsValue ,
92+ format : Option < TableReadFormat > ,
93+ ) -> ApiResult < Option < UpdateData > > {
9194 let err_fn = || JsValue :: from ( format ! ( "Failed to construct Table {:?}" , value) ) ;
9295 if value. is_undefined ( ) {
9396 Err ( err_fn ( ) . into ( ) )
9497 } else if value. is_string ( ) {
95- Ok ( Some ( UpdateData :: Csv ( value. as_string ( ) . into_apierror ( ) ?) ) )
98+ match format {
99+ None | Some ( TableReadFormat :: Csv ) => {
100+ Ok ( Some ( UpdateData :: Csv ( value. as_string ( ) . into_apierror ( ) ?) ) )
101+ } ,
102+ Some ( TableReadFormat :: JsonString ) => Ok ( Some ( UpdateData :: JsonRows (
103+ value. as_string ( ) . into_apierror ( ) ?,
104+ ) ) ) ,
105+ Some ( TableReadFormat :: ColumnsString ) => Ok ( Some ( UpdateData :: JsonColumns (
106+ value. as_string ( ) . into_apierror ( ) ?,
107+ ) ) ) ,
108+ Some ( TableReadFormat :: Arrow ) => Ok ( Some ( UpdateData :: Arrow (
109+ value. as_string ( ) . into_apierror ( ) ?. into_bytes ( ) . into ( ) ,
110+ ) ) ) ,
111+ }
96112 } else if value. is_instance_of :: < ArrayBuffer > ( ) {
97113 let uint8array = Uint8Array :: new ( value) ;
98114 let slice = uint8array. to_vec ( ) ;
99- Ok ( Some ( UpdateData :: Arrow ( slice. into ( ) ) ) )
115+ match format {
116+ Some ( TableReadFormat :: Csv ) => Ok ( Some ( UpdateData :: Csv ( String :: from_utf8 ( slice) ?) ) ) ,
117+ Some ( TableReadFormat :: JsonString ) => {
118+ Ok ( Some ( UpdateData :: JsonRows ( String :: from_utf8 ( slice) ?) ) )
119+ } ,
120+ Some ( TableReadFormat :: ColumnsString ) => {
121+ Ok ( Some ( UpdateData :: JsonColumns ( String :: from_utf8 ( slice) ?) ) )
122+ } ,
123+ None | Some ( TableReadFormat :: Arrow ) => Ok ( Some ( UpdateData :: Arrow ( slice. into ( ) ) ) ) ,
124+ }
100125 } else if let Some ( uint8array) = value. dyn_ref :: < Uint8Array > ( ) {
101126 let slice = uint8array. to_vec ( ) ;
102- Ok ( Some ( UpdateData :: Arrow ( slice. into ( ) ) ) )
127+ match format {
128+ Some ( TableReadFormat :: Csv ) => Ok ( Some ( UpdateData :: Csv ( String :: from_utf8 ( slice) ?) ) ) ,
129+ Some ( TableReadFormat :: JsonString ) => {
130+ Ok ( Some ( UpdateData :: JsonRows ( String :: from_utf8 ( slice) ?) ) )
131+ } ,
132+ Some ( TableReadFormat :: ColumnsString ) => {
133+ Ok ( Some ( UpdateData :: JsonColumns ( String :: from_utf8 ( slice) ?) ) )
134+ } ,
135+ None | Some ( TableReadFormat :: Arrow ) => Ok ( Some ( UpdateData :: Arrow ( slice. into ( ) ) ) ) ,
136+ }
103137 } else if value. is_instance_of :: < Array > ( ) {
104138 let rows = JSON :: stringify ( value) ?. as_string ( ) . into_apierror ( ) ?;
105139 Ok ( Some ( UpdateData :: JsonRows ( rows) ) )
@@ -108,8 +142,8 @@ pub(crate) impl UpdateData {
108142 }
109143 }
110144
111- fn from_js_value ( value : & JsValue ) -> ApiResult < UpdateData > {
112- match TableData :: from_js_value ( value) ? {
145+ fn from_js_value ( value : & JsValue , format : Option < TableReadFormat > ) -> ApiResult < UpdateData > {
146+ match TableData :: from_js_value ( value, format ) ? {
113147 TableData :: Schema ( _) => Err ( ApiError :: new (
114148 "Method cannot be called with `Schema` argument" ,
115149 ) ) ,
@@ -237,16 +271,28 @@ impl Table {
237271
238272 #[ doc = inherit_docs ! ( "table/replace.md" ) ]
239273 #[ wasm_bindgen]
240- pub async fn remove ( & self , value : & JsValue ) -> ApiResult < ( ) > {
241- let input = UpdateData :: from_js_value ( value) ?;
274+ pub async fn remove ( & self , value : & JsValue , options : Option < JsUpdateOptions > ) -> ApiResult < ( ) > {
275+ let options = options
276+ . into_serde_ext :: < Option < UpdateOptions > > ( ) ?
277+ . unwrap_or_default ( ) ;
278+
279+ let input = UpdateData :: from_js_value ( value, options. format ) ?;
242280 self . 0 . remove ( input) . await ?;
243281 Ok ( ( ) )
244282 }
245283
246284 #[ doc = inherit_docs ! ( "table/replace.md" ) ]
247285 #[ wasm_bindgen]
248- pub async fn replace ( & self , input : & JsValue ) -> ApiResult < ( ) > {
249- let input = UpdateData :: from_js_value ( input) ?;
286+ pub async fn replace (
287+ & self ,
288+ input : & JsValue ,
289+ options : Option < JsUpdateOptions > ,
290+ ) -> ApiResult < ( ) > {
291+ let options = options
292+ . into_serde_ext :: < Option < UpdateOptions > > ( ) ?
293+ . unwrap_or_default ( ) ;
294+
295+ let input = UpdateData :: from_js_value ( input, options. format ) ?;
250296 self . 0 . replace ( input) . await ?;
251297 Ok ( ( ) )
252298 }
@@ -258,11 +304,11 @@ impl Table {
258304 input : & JsTableInitData ,
259305 options : Option < JsUpdateOptions > ,
260306 ) -> ApiResult < ( ) > {
261- let input = UpdateData :: from_js_value ( input) ?;
262307 let options = options
263308 . into_serde_ext :: < Option < UpdateOptions > > ( ) ?
264309 . unwrap_or_default ( ) ;
265310
311+ let input = UpdateData :: from_js_value ( input, options. format ) ?;
266312 self . 0 . update ( input, options) . await ?;
267313 Ok ( ( ) )
268314 }
0 commit comments