fret_runtime/menu/wire/
load.rs1use 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}