ddoc/config/
menu.rs

1use {
2    crate::*,
3    std::{
4        fmt,
5        str::FromStr,
6    },
7};
8
9/// The settings for the insertion of a menu in a web page.
10#[derive(Debug, Clone, Copy)]
11pub struct Menu {
12    pub hamburger_checkbox: bool,
13}
14
15impl FromStr for Menu {
16    type Err = &'static str;
17    fn from_str(s: &str) -> Result<Self, Self::Err> {
18        if s != "menu" {
19            return Err("Menu must be 'menu'");
20        }
21        Ok(Self {
22            hamburger_checkbox: true,
23        })
24    }
25}
26
27impl Default for Menu {
28    fn default() -> Self {
29        Self {
30            hamburger_checkbox: true,
31        }
32    }
33}
34
35impl From<Attributes> for Menu {
36    fn from(map: Attributes) -> Self {
37        let mut menu_insert = Menu::default();
38        if let Some(v) = map
39            .get("hamburger_checkbox")
40            .or_else(|| map.get("hamburger-checkbox"))
41        {
42            if let Some(b) = v.as_bool() {
43                menu_insert.hamburger_checkbox = b;
44            }
45        }
46        menu_insert
47    }
48}
49
50impl fmt::Display for Menu {
51    fn fmt(
52        &self,
53        f: &mut fmt::Formatter<'_>,
54    ) -> fmt::Result {
55        write!(f, "menu")
56    }
57}
58impl serde::Serialize for Menu {
59    fn serialize<S: serde::Serializer>(
60        &self,
61        serializer: S,
62    ) -> Result<S::Ok, S::Error> {
63        serializer.serialize_str(&self.to_string())
64    }
65}
66impl<'de> serde::Deserialize<'de> for Menu {
67    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
68        let s = String::deserialize(deserializer)?;
69        s.parse().map_err(serde::de::Error::custom)
70    }
71}