1use crate::*;
2use thiserror::Error;
3
4#[derive(Debug, Error)]
5pub enum Error {
6 #[error("there was an issue making the request")]
7 Ureq(#[from] ureq::Error),
8 #[error("there was an issue deserializing a response to JSON")]
9 Io(#[from] std::io::Error),
10 #[error("there was an issue fitting JSON to a strong type")]
11 Json(#[from] serde_path_to_error::Error<serde_json::Error>),
12}
13
14pub type Result<T> = std::result::Result<T, Error>;
15
16fn get<T>(endpoint: &str, token: Option<&str>) -> Result<T>
17where
18 T: serde::de::DeserializeOwned,
19{
20 let request = ureq::get(endpoint);
21
22 if let Some(token) = token {
23 request.set("Authorization", &format!("token {}", token));
24 }
25
26 let response = ureq::get(endpoint).call()?;
27 let string = response.into_string()?;
28 let deserializer = &mut serde_json::Deserializer::from_str(&string);
29
30 Ok(serde_path_to_error::deserialize(deserializer)?)
31}
32
33pub fn get_repository<A, B, C>(owner: A, repository: B, token: Option<C>) -> Result<Repository>
34where
35 A: AsRef<str>,
36 B: AsRef<str>,
37 C: AsRef<str>,
38{
39 get(
40 &format!(
41 "https://api.github.com/repos/{}/{}",
42 owner.as_ref(),
43 repository.as_ref()
44 ),
45 token.as_ref().map(|x| x.as_ref()),
46 )
47}
48
49pub fn get_repository_releases<A, B, C>(
50 owner: A,
51 repository: B,
52 token: Option<C>,
53) -> Result<Vec<Release>>
54where
55 A: AsRef<str>,
56 B: AsRef<str>,
57 C: AsRef<str>,
58{
59 get(
60 &format!(
61 "https://api.github.com/repos/{}/{}/releases",
62 owner.as_ref(),
63 repository.as_ref()
64 ),
65 token.as_ref().map(|x| x.as_ref()),
66 )
67}