Skip to main content

leyline/core/device/
wire.rs

1use std::collections::BTreeMap;
2
3use serde::ser::{Serialize, SerializeStruct, Serializer};
4
5use super::Device;
6
7const FIELDS: usize = 16;
8
9impl Serialize for Device {
10    fn serialize<S: Serializer>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error> {
11        let device = self.sanitized();
12        let Device {
13            identity,
14            platform,
15            brand,
16            profile_toml,
17            profile_id,
18            user_agent,
19            proxy,
20            proxy_password_env,
21            languages,
22            env_proxy,
23            jar_path,
24            jar,
25            state,
26            app: values,
27            strict,
28            page,
29        } = &device;
30        let mut out = serializer.serialize_struct("Device", FIELDS)?;
31        out.serialize_field("identity", identity)?;
32        out.serialize_field("platform", platform)?;
33        out.serialize_field("brand", brand)?;
34        optional(&mut out, "profile_toml", profile_toml.as_ref())?;
35        out.serialize_field("profile_id", profile_id)?;
36        optional(&mut out, "user_agent", user_agent.as_ref())?;
37        network(
38            &mut out,
39            proxy,
40            proxy_password_env.as_ref(),
41            languages,
42            *env_proxy,
43        )?;
44        storage(&mut out, jar_path.as_ref(), jar.as_ref(), state)?;
45        app(&mut out, values)?;
46        out.serialize_field("strict", strict)?;
47        optional(&mut out, "page", page.as_ref())?;
48        out.end()
49    }
50}
51
52fn network<S: SerializeStruct>(
53    out: &mut S,
54    proxy: &Option<crate::core::ProxyUrl>,
55    password_env: Option<&String>,
56    languages: &Option<Vec<String>>,
57    env_proxy: bool,
58) -> std::result::Result<(), S::Error> {
59    out.serialize_field("proxy", proxy)?;
60    optional(out, "proxy_password_env", password_env)?;
61    out.serialize_field("languages", languages)?;
62    out.serialize_field("env_proxy", &env_proxy)
63}
64
65fn storage<S: SerializeStruct>(
66    out: &mut S,
67    jar_path: Option<&std::path::PathBuf>,
68    jar: Option<&crate::cookie::Jar>,
69    state: &crate::core::SessionState,
70) -> std::result::Result<(), S::Error> {
71    optional(out, "jar_path", jar_path)?;
72    optional(out, "jar", jar)?;
73    out.serialize_field("state", state)
74}
75
76fn optional<S: SerializeStruct, T: Serialize>(
77    out: &mut S,
78    name: &'static str,
79    value: Option<&T>,
80) -> std::result::Result<(), S::Error> {
81    match value {
82        Some(value) => out.serialize_field(name, value),
83        None => out.skip_field(name),
84    }
85}
86
87fn app<S: SerializeStruct>(
88    out: &mut S,
89    app: &BTreeMap<String, serde_json::Value>,
90) -> std::result::Result<(), S::Error> {
91    if app.is_empty() {
92        out.skip_field("app")
93    } else {
94        out.serialize_field("app", app)
95    }
96}