use crate::database::DbContext;
use crate::errors::Error;
use crate::github::{self, Account, GitHubAPI};
use alfred::Item;
pub struct Workflow {
accounts: Vec<Account>,
db: DbContext,
}
impl Workflow {
#[inline]
pub fn new(api_keys: &str, database_url: &str) -> Result<Self, Error> {
let accounts = github::parse_accounts(api_keys)?;
let db = DbContext::new(database_url)?;
Ok(Workflow { accounts, db })
}
#[inline]
pub fn refresh_cache(&mut self) -> Result<(), Error> {
let mut repositories = Vec::new();
for account in &self.accounts {
let api = GitHubAPI::new(account);
for page in api.accessible_repositories() {
repositories.extend(page?);
}
}
self.db.replace_repositories(&repositories)?;
self.db.optimize()?;
Ok(())
}
#[inline]
pub fn query<'items>(&self, repo_name: &str) -> Result<Vec<Item<'items>>, Error> {
self.db
.find_repositories(repo_name, 10)?
.into_iter()
.map(|repo| {
Ok(alfred::ItemBuilder::new(repo.name_with_owner)
.subtitle(repo.name.clone())
.autocomplete(repo.name)
.arg(format!("open {}", repo.url))
.into_item())
})
.collect::<Result<Vec<_>, _>>()
}
}