use facett::menu::Command;
use super::{look_names, HolgerUiApp, Tab, ToolsFn};
fn tab_from_id(id: &str) -> Option<Tab> {
Some(match id {
"status" => Tab::Status,
"repos" => Tab::Repos,
"browse" => Tab::Browse,
"archive" => Tab::Archive,
"artifact" => Tab::Artifact,
"graph" => Tab::Graph,
"helix" => Tab::Helix,
"lineage" => Tab::Lineage,
"tools" => Tab::Tools,
"upload" => Tab::Upload,
_ => return None,
})
}
fn tool_from_id(id: &str) -> Option<ToolsFn> {
Some(match id {
"holger-ds" => ToolsFn::HolgerDs,
"migrate" => ToolsFn::Migrate,
"security" => ToolsFn::Security,
"deploy" => ToolsFn::Deploy,
"airgap" => ToolsFn::Airgap,
"demo" => ToolsFn::Demo,
_ => return None,
})
}
impl HolgerUiApp {
pub(super) fn build_commands(&self) -> Vec<Command> {
let mut c = Vec::new();
for (id, label) in [
("status", "Status"),
("repos", "Repos"),
("browse", "Browse"),
("archive", "Archive"),
("artifact", "Artifact"),
("graph", "Graph"),
("helix", "Helix"),
("lineage", "Lineage"),
("tools", "Tools"),
] {
c.push(Command::new(format!("goto:{id}"), format!("Go to {label}"), "View"));
}
if !self.static_mode {
c.push(Command::new("goto:upload", "Go to Upload", "View"));
}
for (id, label) in [
("holger-ds", "holger-ds (delivery bench)"),
("migrate", "Migrate"),
("security", "Security scan (Móðguðr)"),
("deploy", "Deploy (Skíðblaðnir)"),
("airgap", "Airgap populate"),
("demo", "Demo appliance (jera container)"),
] {
c.push(Command::new(format!("tool:{id}"), format!("Tool: {label}"), "Operate"));
}
for r in &self.data.repos.repos {
c.push(
Command::new(format!("repo:{}", r.name), format!("Open repo · {}", r.name), "Repositories")
.keywords([r.name.as_str(), "repository", "browse"]),
);
}
c.push(Command::new("action:refresh", "Refresh repositories", "Action").shortcut("F5"));
c.push(Command::new("action:scan-selected", "Scan selected repo", "Action"));
c.push(Command::new("action:toggle-static", "Toggle static (Skade Vinter) mode", "Action"));
c.push(Command::new("about:open", "About holger", "Help"));
for name in look_names() {
c.push(Command::new(format!("look:{name}"), format!("Look: {name}"), "Look"));
}
c
}
pub(super) fn dispatch_command(&mut self, id: &str) {
if let Some(tab) = id.strip_prefix("goto:") {
if let Some(t) = tab_from_id(tab) {
self.tab = t;
}
} else if let Some(tool) = id.strip_prefix("tool:") {
if let Some(tf) = tool_from_id(tool) {
self.tab = Tab::Tools;
self.tool = tf;
}
} else if let Some(name) = id.strip_prefix("repo:") {
if let Some(i) = self.data.repos.repos.iter().position(|r| r.name == name) {
self.select_repo(i);
self.tab = Tab::Browse;
}
} else if let Some(look) = id.strip_prefix("look:") {
if let Some(i) = look_names().iter().position(|n| n == look) {
self.set_look_preset(i);
}
} else {
match id {
"action:refresh" => self.data.refresh_repos(),
"action:scan-selected" => {
self.tab = Tab::Tools;
self.tool = ToolsFn::Security;
}
"action:toggle-static" => self.static_mode = !self.static_mode,
"about:open" => self.about_open = true,
_ => {}
}
}
}
pub fn run_command(&mut self, id: &str) {
self.palette.invoke(id);
self.dispatch_command(id);
}
pub fn apply_repo_row_nav(&mut self, i: usize, action: &str) {
self.select_repo(i);
match action {
"row:browse" => self.tab = Tab::Browse,
"row:scan" => {
self.tab = Tab::Tools;
self.tool = ToolsFn::Security;
}
"row:archive" => self.tab = Tab::Archive,
_ => {}
}
}
}