Skip to content

Commit

Permalink
Port to serde_wasm_bindgen
Browse files Browse the repository at this point in the history
  • Loading branch information
texodus committed Feb 22, 2023
1 parent 059d459 commit 531886f
Show file tree
Hide file tree
Showing 21 changed files with 121 additions and 362 deletions.
332 changes: 31 additions & 301 deletions rust/perspective-viewer/Cargo.lock

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions rust/perspective-viewer/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ serde = { version = "1.0", features = ["derive"] }
# Support for "unknown"/dictionary types such as `plugin_config`
serde_json = { version = "1.0.59", features = ["raw_value"] }

serde-wasm-bindgen = "0.4.5"
# Async-aware logging that can be disabled at compile-time.
tracing = { version = ">=0.1.36", features = [
"release_max_level_error",
Expand Down
24 changes: 12 additions & 12 deletions rust/perspective-viewer/src/rust/config/view_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,7 @@ impl ViewConfig {
pub fn as_jsvalue(&self) -> ApiResult<JsPerspectiveViewConfig> {
let mut new_config = self.clone();
new_config.columns.retain(|x| x.is_some());
Ok(JsValue::from_serde(&new_config).map(|x| x.unchecked_into())?)
}

pub fn is_aggregated(&self) -> bool {
!self.group_by.is_empty()
Ok(JsValue::from_serde_ext(&new_config).map(|x| x.unchecked_into())?)
}

pub fn reset(&mut self, reset_expressions: bool) {
Expand All @@ -90,6 +86,10 @@ impl ViewConfig {
changed
}

pub fn is_aggregated(&self) -> bool {
!self.group_by.is_empty()
}

pub fn is_column_expression_in_use(&self, name: &str) -> bool {
let name = name.to_owned();
self.group_by.contains(&name)
Expand Down Expand Up @@ -137,7 +137,7 @@ mod tests {
}
});

let rec: ViewConfig = x.into_serde().unwrap();
let rec: ViewConfig = x.into_serde_ext().unwrap();
assert_eq!(
*rec.aggregates.get("x").unwrap(),
Aggregate::MultiAggregate(MultiAggregate::WeightedMean, "y".to_owned())
Expand All @@ -150,7 +150,7 @@ mod tests {
"group_by": ["Test"]
});

let rec: ViewConfig = x.into_serde().unwrap();
let rec: ViewConfig = x.into_serde_ext().unwrap();
assert_eq!(rec.group_by, vec!("Test"));
}

Expand All @@ -159,7 +159,7 @@ mod tests {
let x = json!({
"split_by": ["Test"]
});
let rec: ViewConfig = x.into_serde().unwrap();
let rec: ViewConfig = x.into_serde_ext().unwrap();
assert_eq!(rec.split_by, vec!("Test"));
}

Expand All @@ -171,7 +171,7 @@ mod tests {
.collect::<Array>();

let x = json!({ "filter": [filter] });
let rec: ViewConfig = x.into_serde().unwrap();
let rec: ViewConfig = x.into_serde_ext().unwrap();
assert_eq!(
rec.filter,
vec!(Filter(
Expand All @@ -189,7 +189,7 @@ mod tests {
.collect::<Array>();

let x = json!({ "filter": [filter] });
let rec: ViewConfig = x.into_serde().unwrap();
let rec: ViewConfig = x.into_serde_ext().unwrap();
assert_eq!(
rec.filter,
vec!(Filter(
Expand All @@ -208,7 +208,7 @@ mod tests {
.collect::<Array>();

let x = json!({ "sort": [sort] });
let rec: ViewConfig = x.into_serde().unwrap();
let rec: ViewConfig = x.into_serde_ext().unwrap();
assert_eq!(rec.sort, vec!(Sort("Test".to_owned(), SortDir::Asc,)));
}

Expand All @@ -225,7 +225,7 @@ mod tests {
.collect::<Array>();

let x = json!({"sort": [sort1, sort2]});
let rec: ViewConfig = x.into_serde().unwrap();
let rec: ViewConfig = x.into_serde_ext().unwrap();
assert_eq!(
rec.sort,
vec!(
Expand Down
4 changes: 2 additions & 2 deletions rust/perspective-viewer/src/rust/config/viewer_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ impl ViewerConfig {
Some(ViewerConfigEncoding::JSONString) => {
Ok(JsValue::from(serde_json::to_string(self)?))
}
None | Some(ViewerConfigEncoding::Json) => Ok(JsValue::from_serde(self)?),
None | Some(ViewerConfigEncoding::Json) => Ok(JsValue::from_serde_ext(self)?),
}
}
}
Expand Down Expand Up @@ -151,7 +151,7 @@ impl ViewerConfigUpdate {
uint8array.copy_to(&mut slice[..]);
Ok(rmp_serde::from_slice(&slice)?)
} else {
Ok(update.into_serde()?)
Ok(update.into_serde_ext()?)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ pub struct PerspectiveDateColumnStyleElement {

fn on_change(elem: &web_sys::HtmlElement, config: &DatetimeColumnStyleConfig) {
let mut event_init = web_sys::CustomEventInit::new();
event_init.detail(&JsValue::from_serde(config).unwrap());
event_init.detail(&JsValue::from_serde_ext(config).unwrap());
let event =
CustomEvent::new_with_event_init_dict("perspective-column-style-change", &event_init);

Expand All @@ -49,7 +49,7 @@ impl PerspectiveDateColumnStyleElement {
/// # Arguments
/// * `config` - a `ColumnStyle` config in JSON form.
pub fn reset(&mut self, config: JsValue) -> ApiResult<()> {
let msg = DatetimeColumnStyleMsg::Reset(config.into_serde().unwrap());
let msg = DatetimeColumnStyleMsg::Reset(config.into_serde_ext().unwrap());
self.modal.as_apierror()?.send_message(msg);
Ok(())
}
Expand All @@ -67,9 +67,9 @@ impl PerspectiveDateColumnStyleElement {
if self.modal.is_some() {
self.reset(js_config)?;
} else {
let config: DatetimeColumnStyleConfig = js_config.into_serde().unwrap();
let config: DatetimeColumnStyleConfig = js_config.into_serde_ext().unwrap();
let default_config: DatetimeColumnStyleDefaultConfig =
js_default_config.into_serde().unwrap();
js_default_config.into_serde_ext().unwrap();

let on_change = {
clone!(self.elem);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ pub struct PerspectiveDatetimeColumnStyleElement {

fn on_change(elem: &web_sys::HtmlElement, config: &DatetimeColumnStyleConfig) {
let mut event_init = web_sys::CustomEventInit::new();
event_init.detail(&JsValue::from_serde(config).unwrap());
event_init.detail(&JsValue::from_serde_ext(config).unwrap());
let event =
CustomEvent::new_with_event_init_dict("perspective-column-style-change", &event_init);

Expand All @@ -49,7 +49,7 @@ impl PerspectiveDatetimeColumnStyleElement {
/// # Arguments
/// * `config` - a `ColumnStyle` config in JSON form.
pub fn reset(&mut self, config: JsValue) -> ApiResult<()> {
let msg = DatetimeColumnStyleMsg::Reset(config.into_serde().unwrap());
let msg = DatetimeColumnStyleMsg::Reset(config.into_serde_ext().unwrap());
self.modal.as_apierror()?.send_message(msg);
Ok(())
}
Expand All @@ -67,9 +67,9 @@ impl PerspectiveDatetimeColumnStyleElement {
if self.modal.is_some() {
self.reset(js_config)?;
} else {
let config: DatetimeColumnStyleConfig = js_config.into_serde().unwrap();
let config: DatetimeColumnStyleConfig = js_config.into_serde_ext().unwrap();
let default_config: DatetimeColumnStyleDefaultConfig =
js_default_config.into_serde().unwrap();
js_default_config.into_serde_ext().unwrap();

let on_change = {
clone!(self.elem);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ impl PerspectiveDebugPluginElement {
"Debug".to_owned()
}

#[wasm_bindgen(getter, typescript_type = "'select' | 'toggle'")]
#[wasm_bindgen(getter)]
pub fn select_mode(&self) -> String {
"select".to_owned()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ pub struct PerspectiveNumberColumnStyleElement {

fn on_change(elem: &web_sys::HtmlElement, config: &NumberColumnStyleConfig) {
let mut event_init = web_sys::CustomEventInit::new();
event_init.detail(&JsValue::from_serde(config).unwrap());
event_init.detail(&JsValue::from_serde_ext(config).unwrap());
let event =
CustomEvent::new_with_event_init_dict("perspective-column-style-change", &event_init);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ pub struct PerspectiveStringColumnStyleElement {

fn on_change(elem: &web_sys::HtmlElement, config: &StringColumnStyleConfig) {
let mut event_init = web_sys::CustomEventInit::new();
event_init.detail(&JsValue::from_serde(config).unwrap());
event_init.detail(&JsValue::from_serde_ext(config).unwrap());
let event =
CustomEvent::new_with_event_init_dict("perspective-column-style-change", &event_init);

Expand All @@ -49,7 +49,7 @@ impl PerspectiveStringColumnStyleElement {
/// # Arguments
/// * `config` - a `ColumnStyle` config in JSON form.
pub fn reset(&mut self, config: JsValue) -> ApiResult<()> {
let msg = StringColumnStyleMsg::Reset(config.into_serde().unwrap());
let msg = StringColumnStyleMsg::Reset(config.into_serde_ext().unwrap());
self.modal.as_apierror()?.send_message(msg);
Ok(())
}
Expand All @@ -67,9 +67,9 @@ impl PerspectiveStringColumnStyleElement {
if self.modal.is_some() {
self.reset(js_config)?;
} else {
let config: StringColumnStyleConfig = js_config.into_serde().unwrap();
let config: StringColumnStyleConfig = js_config.into_serde_ext().unwrap();
let default_config: StringColumnStyleDefaultConfig =
js_default_config.into_serde().unwrap();
js_default_config.into_serde_ext().unwrap();

let on_change = {
clone!(self.elem);
Expand Down
4 changes: 2 additions & 2 deletions rust/perspective-viewer/src/rust/custom_elements/viewer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -342,8 +342,8 @@ impl PerspectiveViewerElement {
let result = async {
let plugin = renderer.get_active_plugin()?;
if let Some(plugin_config) = &plugin_config {
let js_config = JsValue::from_serde(plugin_config);
plugin.restore(&js_config?);
let js_config = JsValue::from_serde_ext(plugin_config)?;
plugin.restore(&js_config);
}

session.validate().await?.create_view().await
Expand Down
2 changes: 1 addition & 1 deletion rust/perspective-viewer/src/rust/custom_events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ impl CustomEventsDataRc {
if viewer_config.view_config != Default::default()
&& Some(&viewer_config) != self.last_dispatched.borrow().as_ref()
{
let json_config = JsValue::from_serde(&viewer_config)?;
let json_config = JsValue::from_serde_ext(&viewer_config)?;
let mut event_init = web_sys::CustomEventInit::new();
event_init.detail(&json_config);
let event = web_sys::CustomEvent::new_with_event_init_dict(
Expand Down
6 changes: 4 additions & 2 deletions rust/perspective-viewer/src/rust/js/plugin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,10 @@ impl JsPerspectiveViewerPlugin {
pub fn get_requirements(&self) -> ApiResult<ViewConfigRequirements> {
Ok(ViewConfigRequirements {
min: self.min_config_columns(),
mode: self.select_mode().into_serde()?,
names: self.config_column_names().map(|x| x.into_serde().unwrap()),
mode: self.select_mode().into_serde_ext()?,
names: self
.config_column_names()
.map(|x| x.into_serde_ext().unwrap()),
max_columns: self.max_columns(),
max_cells: self.max_cells(),
name: self.name(),
Expand Down
5 changes: 3 additions & 2 deletions rust/perspective-viewer/src/rust/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ pub mod utils;

#[cfg(feature = "define_custom_elements_async")]
pub use components::{LocalStyle, StyleProvider};
use utils::JsValueSerdeExt;
use wasm_bindgen::prelude::*;

use crate::custom_elements::copy_dropdown::CopyDropDownMenuElement;
Expand All @@ -55,8 +56,8 @@ pub fn register_plugin(name: &str) {
pub fn get_exprtk_commands() -> ApiResult<Box<[JsValue]>> {
crate::exprtk::COMPLETIONS.with(|x| {
Ok(x.iter()
.map(JsValue::from_serde)
.collect::<Result<Box<[_]>, serde_json::Error>>()?)
.map(<JsValue as JsValueSerdeExt>::from_serde_ext)
.collect::<Result<Box<[_]>, serde_wasm_bindgen::Error>>()?)
})
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ pub trait GetViewerConfigModel: HasSession + HasRenderer + HasTheme {
let js_plugin = renderer.get_active_plugin()?;
let settings = renderer.is_settings_open();
let plugin = js_plugin.name();
let plugin_config: serde_json::Value = js_plugin.save().into_serde()?;
let plugin_config: serde_json::Value = js_plugin.save().into_serde_ext()?;
let theme = theme.get_name().await;
Ok(ViewerConfig {
plugin,
Expand Down
4 changes: 2 additions & 2 deletions rust/perspective-viewer/src/rust/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ impl Session {
let error_keys = js_sys::Object::keys(&errors);
if error_keys.length() > 0 {
let js_err = js_sys::Reflect::get(&errors, &error_keys.get(0))?;
Ok(Some(js_err.into_serde().unwrap()))
Ok(Some(js_err.into_serde_ext().unwrap()))
} else {
Ok(None)
}
Expand Down Expand Up @@ -323,7 +323,7 @@ impl Session {
if let Err(err) = self.validate_view_config().await {
web_sys::console::error_3(
&"Invalid config, resetting to default".into(),
&JsValue::from_serde(&self.borrow().config).unwrap(),
&JsValue::from_serde_ext(&self.borrow().config).unwrap(),
&err.into(),
);

Expand Down
8 changes: 4 additions & 4 deletions rust/perspective-viewer/src/rust/session/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ impl SessionMetadata {
}
};

let table_schema = table.schema().await?.into_serde()?;
let table_schema = table.schema().await?.into_serde_ext()?;
let edit_port = table.make_port().await?;
Ok(Self(Some(SessionMetadataState {
column_names,
Expand All @@ -81,7 +81,7 @@ impl SessionMetadata {
&mut self,
view_schema: &JsPerspectiveViewSchema,
) -> ApiResult<()> {
let view_schema = view_schema.into_serde()?;
let view_schema = view_schema.into_serde_ext()?;
self.as_mut().unwrap().view_schema = Some(view_schema);
Ok(())
}
Expand All @@ -95,10 +95,10 @@ impl SessionMetadata {
}

let expression_alias: HashMap<String, String> =
valid_recs.expression_alias().into_serde()?;
valid_recs.expression_alias().into_serde_ext()?;

let expression_schema: HashMap<String, Type> =
valid_recs.expression_schema().into_serde()?;
valid_recs.expression_schema().into_serde_ext()?;

let expression_names = expression_schema.keys().cloned().collect::<HashSet<_>>();

Expand Down
1 change: 1 addition & 0 deletions rust/perspective-viewer/src/rust/utils/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ macro_rules! define_api_error {

define_api_error!(
serde_json::Error,
serde_wasm_bindgen::Error,
std::io::Error,
rmp_serde::encode::Error,
rmp_serde::decode::Error,
Expand Down
2 changes: 2 additions & 0 deletions rust/perspective-viewer/src/rust/utils/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ mod futures;
mod json;
mod pubsub;
mod scope;
mod serde;
mod tee;
mod wasm_abi;
mod weak_scope;
Expand All @@ -44,6 +45,7 @@ pub use wasm_abi::*;
pub use weak_scope::*;

pub use self::futures::*;
pub use self::serde::*;

#[macro_export]
macro_rules! maybe {
Expand Down
34 changes: 34 additions & 0 deletions rust/perspective-viewer/src/rust/utils/serde.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
use wasm_bindgen::JsValue;

pub trait JsValueSerdeExt {
fn from_serde_ext<T>(t: &T) -> Result<JsValue, serde_wasm_bindgen::Error>
where
T: serde::ser::Serialize + ?Sized;

fn into_serde_ext<T>(self) -> Result<T, serde_wasm_bindgen::Error>
where
T: for<'a> serde::de::Deserialize<'a>;
}

impl<U> JsValueSerdeExt for U
where
U: Into<JsValue>,
{
fn from_serde_ext<T>(t: &T) -> Result<JsValue, serde_wasm_bindgen::Error>
where
T: serde::ser::Serialize + ?Sized,
{
t.serialize(
&serde_wasm_bindgen::Serializer::new()
.serialize_maps_as_objects(true)
.serialize_missing_as_null(true),
)
}

fn into_serde_ext<T>(self) -> Result<T, serde_wasm_bindgen::Error>
where
T: for<'a> serde::de::Deserialize<'a>,
{
serde_wasm_bindgen::from_value(self.into())
}
}
Loading

0 comments on commit 531886f

Please sign in to comment.