leyline/core/device/
wire.rs1use 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}