use alfrusco::config::AlfredEnvProvider;
use alfrusco::{execute, Item, Runnable, Workflow};
use clap::Parser;
const CATEGORIES: &[(&str, &[(&str, &str)])] = &[
(
"fruits",
&[
("Apple", "https://en.wikipedia.org/wiki/Apple"),
("Banana", "https://en.wikipedia.org/wiki/Banana"),
("Cherry", "https://en.wikipedia.org/wiki/Cherry"),
],
),
(
"colors",
&[
("Red", "https://en.wikipedia.org/wiki/Red"),
("Green", "https://en.wikipedia.org/wiki/Green"),
("Blue", "https://en.wikipedia.org/wiki/Blue"),
],
),
(
"planets",
&[
("Mars", "https://en.wikipedia.org/wiki/Mars"),
("Venus", "https://en.wikipedia.org/wiki/Venus"),
("Saturn", "https://en.wikipedia.org/wiki/Saturn"),
],
),
];
#[derive(Parser)]
#[command(name = "menu")]
struct MenuWorkflow {
query: Vec<String>,
}
impl Runnable for MenuWorkflow {
type Error = alfrusco::Error;
fn run(self, workflow: &mut Workflow) -> Result<(), Self::Error> {
let query = self.query.join(" ");
let category = std::env::var("category").ok().filter(|s| !s.is_empty());
match category.as_deref().or_else(|| {
CATEGORIES
.iter()
.find(|(name, _)| *name == query)
.map(|(name, _)| *name)
}) {
Some(cat) => {
if let Some((_, items)) = CATEGORIES.iter().find(|(name, _)| *name == cat) {
for (title, url) in *items {
workflow.append_item(
Item::new(*title)
.subtitle(format!("Open {url}"))
.arg(*url)
.valid(true),
);
}
} else {
workflow.append_item(
Item::new(format!("Unknown category: {cat}"))
.subtitle("No items found")
.valid(false),
);
}
}
None => {
workflow.set_filter_keyword(query);
for (name, items) in CATEGORIES {
workflow.append_item(
Item::new(capitalize(name))
.subtitle(format!("{} items", items.len()))
.arg(*name)
.var("category", *name)
.autocomplete(*name)
.valid(true),
);
}
}
}
Ok(())
}
}
fn capitalize(s: &str) -> String {
let mut chars = s.chars();
match chars.next() {
None => String::new(),
Some(c) => c.to_uppercase().collect::<String>() + chars.as_str(),
}
}
fn main() {
let _ = alfrusco::init_logging(&AlfredEnvProvider);
let command = MenuWorkflow::parse();
execute(&AlfredEnvProvider, command, &mut std::io::stdout());
}