use graphql_client::GraphQLQuery;
use url::{ParseError, Url};
use crate::ApiKey;
pub struct LinearClient {
base_url: Url,
key: ApiKey,
client: reqwest::Client,
}
impl LinearClient {
pub fn new(key: &ApiKey) -> Self {
LinearClientBuilder::new(key).build()
}
pub fn builder(key: &ApiKey) -> LinearClientBuilder {
LinearClientBuilder::new(key)
}
pub(crate) fn base_url(&self) -> &Url {
&self.base_url
}
pub(crate) fn key(&self) -> &ApiKey {
&self.key
}
pub(crate) async fn post_graphql<Q: GraphQLQuery>(
&self,
variables: Q::Variables,
) -> Result<graphql_client::Response<Q::ResponseData>, reqwest::Error> {
let body = Q::build_query(variables);
let response = self
.client
.post(self.base_url().clone())
.bearer_auth(self.key())
.json(&body)
.send()
.await?;
response.json().await
}
pub async fn issue(
&self,
id: &str,
) -> Result<crate::graphql::issue::issue::ResponseData, reqwest::Error> {
let response_body = self
.post_graphql::<crate::graphql::issue::Issue>(crate::graphql::issue::issue::Variables {
id: id.to_string(),
})
.await?;
Ok(response_body.data.expect("No data"))
}
}
pub struct LinearClientBuilder<'a> {
base_url: Url,
key: &'a ApiKey,
}
impl<'a> LinearClientBuilder<'a> {
pub fn new(key: &'a ApiKey) -> Self {
Self {
base_url: Url::parse("https://api.linear.app/graphql").unwrap(),
key,
}
}
pub fn base_url(mut self, base_url: &'a str) -> Result<LinearClientBuilder, ParseError> {
self.base_url = Url::parse(base_url)?;
Ok(self)
}
pub fn key(mut self, key: &'a ApiKey) -> Self {
self.key = key;
self
}
pub fn build(self) -> LinearClient {
let client = reqwest::Client::builder()
.user_agent(concat!("linear_sdk/", env!("CARGO_PKG_VERSION")))
.build()
.unwrap();
LinearClient {
base_url: self.base_url,
key: self.key.to_owned(),
client,
}
}
}