Skip to main content

fret_runtime/menu/wire/
load.rs

1use super::config_v1::MenuBarConfigFileV1;
2use super::config_v2::MenuBarConfigFileV2;
3use super::shared::MenuBarVersionOnly;
4use super::v1::MenuBarFileV1;
5use super::v2::MenuBarFileV2;
6
7use super::super::{Menu, MenuBar, MenuBarConfig, MenuBarError, MenuItem};
8use std::sync::Arc;
9
10impl MenuBar {
11    pub fn from_bytes(bytes: &[u8]) -> Result<Self, MenuBarError> {
12        let version: MenuBarVersionOnly =
13            serde_json::from_slice(bytes).map_err(|source| MenuBarError::ParseFailed { source })?;
14        match version.menu_bar_version {
15            1 => {
16                let file: MenuBarFileV1 = serde_json::from_slice(bytes)
17                    .map_err(|source| MenuBarError::ParseFailed { source })?;
18                MenuBar::from_v1(file)
19            }
20            2 => {
21                let file: MenuBarFileV2 = serde_json::from_slice(bytes)
22                    .map_err(|source| MenuBarError::ParseFailed { source })?;
23                MenuBar::from_v2(file)
24            }
25            other => Err(MenuBarError::UnsupportedVersion(other)),
26        }
27    }
28
29    pub fn from_v1(file: MenuBarFileV1) -> Result<Self, MenuBarError> {
30        if file.menu_bar_version != 1 {
31            return Err(MenuBarError::UnsupportedVersion(file.menu_bar_version));
32        }
33
34        let mut menus: Vec<Menu> = Vec::with_capacity(file.menus.len());
35        for (menu_index, menu) in file.menus.into_iter().enumerate() {
36            let mut items: Vec<MenuItem> = Vec::with_capacity(menu.items.len());
37            for (item_index, item) in menu.items.into_iter().enumerate() {
38                items.push(
39                    item.into_menu_item(&format!("menus[{menu_index}].items[{item_index}]"))?,
40                );
41            }
42
43            menus.push(Menu {
44                title: Arc::from(menu.title),
45                role: None,
46                mnemonic: None,
47                items,
48            });
49        }
50
51        Ok(MenuBar { menus })
52    }
53
54    pub fn from_v2(file: MenuBarFileV2) -> Result<Self, MenuBarError> {
55        if file.menu_bar_version != 2 {
56            return Err(MenuBarError::UnsupportedVersion(file.menu_bar_version));
57        }
58
59        let mut menus: Vec<Menu> = Vec::with_capacity(file.menus.len());
60        for (menu_index, menu) in file.menus.into_iter().enumerate() {
61            let mut items: Vec<MenuItem> = Vec::with_capacity(menu.items.len());
62            for (item_index, item) in menu.items.into_iter().enumerate() {
63                items.push(
64                    item.into_menu_item(&format!("menus[{menu_index}].items[{item_index}]"))?,
65                );
66            }
67
68            menus.push(Menu {
69                title: Arc::from(menu.title),
70                role: menu.role,
71                mnemonic: menu.mnemonic,
72                items,
73            });
74        }
75
76        Ok(MenuBar { menus })
77    }
78}
79
80impl MenuBarConfig {
81    pub fn from_bytes(bytes: &[u8]) -> Result<Self, MenuBarError> {
82        let version: MenuBarVersionOnly =
83            serde_json::from_slice(bytes).map_err(|source| MenuBarError::ParseFailed { source })?;
84
85        match version.menu_bar_version {
86            1 => {
87                let file: MenuBarConfigFileV1 = serde_json::from_slice(bytes)
88                    .map_err(|source| MenuBarError::ParseFailed { source })?;
89                file.try_into_config_v1()
90            }
91            2 => {
92                let file: MenuBarConfigFileV2 = serde_json::from_slice(bytes)
93                    .map_err(|source| MenuBarError::ParseFailed { source })?;
94                file.try_into_config_v2()
95            }
96            other => Err(MenuBarError::UnsupportedVersion(other)),
97        }
98    }
99}