github_workflow_lib/
workflow.rs1use crate::database::DbContext;
2use crate::errors::Error;
3use crate::github::{self, Account, GitHubAPI};
4use alfred::Item;
5
6pub struct Workflow {
7 accounts: Vec<Account>,
8 db: DbContext,
9}
10
11impl Workflow {
12 #[inline]
19 pub fn new(api_keys: &str, database_url: &str) -> Result<Self, Error> {
20 let accounts = github::parse_accounts(api_keys)?;
21 let db = DbContext::new(database_url)?;
22 Ok(Workflow { accounts, db })
23 }
24
25 #[inline]
33 pub fn refresh_cache(&mut self) -> Result<(), Error> {
34 let mut repositories = Vec::new();
35 for account in &self.accounts {
36 let api = GitHubAPI::new(account);
37 for page in api.accessible_repositories() {
38 repositories.extend(page?);
39 }
40 }
41 self.db.replace_repositories(&repositories)?;
42 self.db.optimize()?;
44 Ok(())
45 }
46
47 #[inline]
52 pub fn query<'items>(&self, repo_name: &str) -> Result<Vec<Item<'items>>, Error> {
53 self.db
54 .find_repositories(repo_name, 10)?
55 .into_iter()
56 .map(|repo| {
57 Ok(alfred::ItemBuilder::new(repo.name_with_owner)
58 .subtitle(repo.name.clone())
59 .autocomplete(repo.name)
60 .arg(format!("open {}", repo.url))
61 .into_item())
62 })
63 .collect::<Result<Vec<_>, _>>()
64 }
65}