in native/desktop-macos/src/macos/application_menu.rs [132:181]
fn from_unsafe(item: &AppMenuItem) -> Result<Self> {
let safe_item = match item {
&AppMenuItem::ActionItem {
enabled,
state,
ref title,
special_tag,
keystroke,
item_id,
} => {
let keystroke = if let Some(keystroke) = keystroke {
Some(AppMenuKeystrokeSafe {
key: copy_to_ns_string(&keystroke.key)?,
modifiers: keystroke.modifiers,
})
} else {
None
};
Self::Action {
enabled,
state,
title: copy_to_ns_string(title)?,
special_tag,
keystroke,
item_id,
}
}
AppMenuItem::SeparatorItem => Self::Separator,
sub_menu @ &AppMenuItem::SubMenuItem {
ref title,
special_tag,
items,
items_count,
} => {
let items = {
if items.is_null() {
return Err(anyhow!("Null found in {sub_menu:?}"));
}
unsafe { slice::from_raw_parts(items, items_count) }
};
let safe_items: Result<Vec<_>> = items.iter().map(|e| Self::from_unsafe(e)).collect();
Self::SubMenu {
title: copy_to_ns_string(title)?,
special_tag,
items: safe_items?,
}
}
};
Ok(safe_item)
}