use crate::error::*;
use crate::github::client::GitHubClient;
use crate::github::graphql::{self, Repository};
use crate::github::{rest, search};
pub struct GitHubService {
pub client: GitHubClient,
}
impl GitHubService {
#[must_use = "Creating a service without using it is wasteful"]
pub fn new() -> Result<Self> {
let client = GitHubClient::new()?;
Ok(Self { client })
}
#[must_use]
pub fn with_client(client: GitHubClient) -> Self {
Self { client }
}
pub async fn get_repository_info(&self, owner: &str, name: &str) -> Result<Repository> {
match graphql::get_repository_info(&self.client, owner, name).await {
Ok(repo) => Ok(repo),
Err(GitHubError::AuthenticationError(_)) if !self.client.has_token() => {
tracing::debug!("GraphQL auth failed without token, falling back to REST");
rest::get_repository_info(&self.client, owner, name).await
}
Err(e) => {
tracing::debug!("GraphQL failed ({}), falling back to REST", e);
rest::get_repository_info(&self.client, owner, name).await
}
}
}
pub async fn search_repositories(
&self,
days_back: u32,
limit: usize,
language: Option<&str>,
min_stars: u32,
) -> Result<Vec<search::SearchRepository>> {
search::search_repositories(&self.client, days_back, limit, language, min_stars).await
}
pub async fn check_rate_limit(&self) -> Result<crate::github::client::RateLimit> {
self.client.check_rate_limit().await
}
#[must_use]
pub fn has_token(&self) -> bool {
self.client.has_token()
}
pub async fn get_user_starred_repositories(&self) -> Result<Vec<String>> {
rest::get_user_starred_repositories(&self.client).await
}
pub async fn get_user_profile(&self) -> Result<rest::UserProfile> {
rest::get_user_profile(&self.client).await
}
pub async fn get_repository_stargazers(
&self,
owner: &str,
name: &str,
per_page: Option<u32>,
page: Option<u32>,
) -> Result<Vec<crate::github::types::StargazerWithDate>> {
rest::get_repository_stargazers(&self.client, owner, name, per_page, page).await
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_github_service_creation() {
let service = GitHubService::new();
assert!(service.is_ok());
}
#[test]
fn test_github_service_has_token_detection() {
let service = GitHubService::new().unwrap();
let _has_token = service.has_token();
}
}