use anyhow::{Result, bail};
use crate::api::client::LinearClient;
use crate::auth;
use crate::auth::token::TokenStore;
use crate::config::Config;
use crate::dispatch;
use crate::message::{Message, Request};
pub async fn client() -> Result<Session> {
let config = Config::load()?;
let token_store = TokenStore::new()?;
if !auth::has_credentials(&token_store, &config)? {
bail!(
"Not signed in. Run `linear-tui auth login` (or `linear-tui auth token <key>`) first."
);
}
let method = auth::resolve_auth(&token_store, config.auth.api_key.as_deref()).await?;
Ok(Session {
client: LinearClient::new(method.into_credentials(token_store)),
per_page: config.ui.items_per_page,
})
}
pub struct Session {
client: LinearClient,
per_page: u32,
}
impl Session {
#[cfg(test)]
pub fn new(client: LinearClient) -> Self {
Self {
client,
per_page: 50,
}
}
pub async fn run(&self, request: Request) -> Result<Message> {
match dispatch::execute_request(&self.client, request, self.per_page).await {
Message::Failed { request, error } => bail!("{}: {error}", request.failure()),
message => Ok(message),
}
}
}