pconvert_rust/wasm/
conversions.rs

1//! From and to conversions for rust and javascript types.
2
3use crate::blending::params::Value;
4use crate::errors::PConvertError;
5use serde::{Deserialize, Serialize};
6use serde_json::Value as JSONValue;
7use std::collections::HashMap;
8use wasm_bindgen::prelude::*;
9
10/// Blending algorithm and extra parameters for WASM module.
11#[derive(Serialize, Deserialize)]
12pub struct JSONParams {
13    pub algorithm: String,
14    pub params: HashMap<String, JSONValue>,
15}
16
17impl From<PConvertError> for JsValue {
18    fn from(err: PConvertError) -> JsValue {
19        match err {
20            PConvertError::ArgumentError(err) => JsValue::from_str(&err),
21            PConvertError::ImageLibError(err) => JsValue::from_str(&err.to_string()),
22            PConvertError::UnsupportedImageTypeError => JsValue::from_str(&err.to_string()),
23            PConvertError::IOError(err) => JsValue::from_str(&err.to_string()),
24        }
25    }
26}
27
28impl From<JSONValue> for Value {
29    fn from(value: JSONValue) -> Value {
30        match value {
31            JSONValue::Bool(boolean) => Value::Bool(boolean),
32            JSONValue::String(string) => Value::Str(string),
33            JSONValue::Number(number) => {
34                if number.is_f64() {
35                    Value::Float(number.as_f64().unwrap())
36                } else if number.is_i64() {
37                    Value::Long(number.as_i64().unwrap())
38                } else {
39                    Value::Invalid
40                }
41            }
42            _ => Value::Invalid,
43        }
44    }
45}