diagnostics_log_types_serde/
serde_ext.rs

1// Copyright 2024 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3
4use crate::Severity;
5use serde::de::Deserializer;
6use serde::{Deserialize, Serializer};
7use std::str::FromStr;
8
9pub mod severity {
10    use super::*;
11
12    pub fn serialize<S>(severity: &Severity, serializer: S) -> Result<S::Ok, S::Error>
13    where
14        S: Serializer,
15    {
16        serializer.serialize_str(severity.as_str())
17    }
18
19    pub fn deserialize<'de, D>(deserializer: D) -> Result<Severity, D::Error>
20    where
21        D: Deserializer<'de>,
22    {
23        let s = String::deserialize(deserializer)?;
24        Severity::from_str(&s).map_err(serde::de::Error::custom)
25    }
26}
27
28pub mod optional_severity {
29    use super::*;
30
31    pub fn serialize<S>(severity: &Option<Severity>, serializer: S) -> Result<S::Ok, S::Error>
32    where
33        S: Serializer,
34    {
35        if let Some(s) = severity.as_ref() {
36            return super::severity::serialize(s, serializer);
37        }
38        serializer.serialize_none()
39    }
40
41    pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Severity>, D::Error>
42    where
43        D: Deserializer<'de>,
44    {
45        let s: Option<String> = Option::deserialize(deserializer)?;
46        match s {
47            None => Ok(None),
48            Some(s) => {
49                let severity = Severity::from_str(&s).map_err(serde::de::Error::custom)?;
50                Ok(Some(severity))
51            }
52        }
53    }
54}