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#[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}