tauri_wasm/
serde.rs

1use {
2    crate::{
3        error::Error,
4        invoke::{Options, ToArgs},
5    },
6    serde::{Serialize, Serializer as _, ser},
7    serde_wasm_bindgen::Serializer,
8    std::collections::HashMap,
9    wasm_bindgen::JsValue,
10};
11
12/// Arbitrary serializable data for
13/// [`with_args`](crate::invoke::Invoke::with_args) function.
14#[inline]
15pub fn args<T>(args: &T) -> Result<impl ToArgs, Error>
16where
17    T: Serialize + ?Sized,
18{
19    struct Data(JsValue);
20
21    impl ToArgs for Data {
22        type JsValue = JsValue;
23
24        fn to_args(self) -> Self::JsValue {
25            self.0
26        }
27    }
28
29    let data = serde_wasm_bindgen::to_value(args).map_err(|e| Error(JsValue::from(e)))?;
30    Ok(Data(data))
31}
32
33impl Options {
34    #[inline]
35    pub fn from_map<K, V>(map: &HashMap<K, V>) -> Result<Self, Error>
36    where
37        K: AsRef<str>,
38        V: AsRef<str>,
39    {
40        use ser::SerializeMap;
41
42        let error = |e| Error(JsValue::from(e));
43
44        let ser = Serializer::new();
45        let mut s = ser.serialize_map(Some(map.len())).map_err(error)?;
46
47        for (key, val) in map {
48            s.serialize_entry(key.as_ref(), val.as_ref())
49                .map_err(error)?;
50        }
51
52        let headers = s.end().map_err(error)?;
53        Ok(Self { headers })
54    }
55
56    #[inline]
57    pub fn from_record<'val, I>(fields: I) -> Result<Self, Error>
58    where
59        I: IntoIterator<IntoIter: ExactSizeIterator, Item = (&'static str, &'val str)>,
60    {
61        use ser::SerializeStruct;
62
63        let fields = fields.into_iter();
64        let error = |e| Error(JsValue::from(e));
65
66        let ser = Serializer::new();
67        let mut s = ser
68            .serialize_struct("Record", fields.len())
69            .map_err(error)?;
70
71        for (key, val) in fields {
72            s.serialize_field(key, val).map_err(error)?;
73        }
74
75        let headers = s.end().map_err(error)?;
76        Ok(Self { headers })
77    }
78}