1use {
2 crate::*,
3 std::{
4 fmt,
5 str::FromStr,
6 },
7};
8
9#[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}