use serde::Deserialize;
use crate::users::User;
use crate::{Future, Github, Stream};
pub struct RepoCommits {
github: Github,
owner: String,
repo: String,
}
impl RepoCommits {
#[doc(hidden)]
pub fn new<O, R>(github: Github, owner: O, repo: R) -> Self
where
O: Into<String>,
R: Into<String>,
{
RepoCommits {
github,
owner: owner.into(),
repo: repo.into(),
}
}
pub fn list(&self, path: &str) -> Future<Vec<RepoCommit>> {
let mut uri = format!("/repos/{}/{}/commits", self.owner, self.repo);
if !path.is_empty() {
uri += &format!("?path={}", path);
}
self.github.get::<Vec<RepoCommit>>(&uri)
}
pub fn iter(&self) -> Stream<RepoCommit> {
self.github
.get_stream(&format!("/repos/{}/{}/commits", self.owner, self.repo))
}
pub fn get(&self, commit_ref: &str) -> Future<RepoCommit> {
let uri = format!("/repos/{}/{}/commits/{}", self.owner, self.repo, commit_ref);
self.github.get::<RepoCommit>(&uri)
}
}
#[derive(Debug, Deserialize)]
pub struct RepoCommit {
pub url: String,
pub sha: String,
pub html_url: String,
pub comments_url: String,
pub commit: CommitDetails,
pub author: User,
pub committer: User,
pub parents: Vec<CommitRef>,
}
#[derive(Debug, Deserialize)]
pub struct CommitDetails {
pub url: String,
pub author: UserStamp,
pub committer: Option<UserStamp>,
pub message: String,
pub tree: CommitRef,
pub comment_count: u64,
}
#[derive(Debug, Deserialize)]
pub struct CommitRef {
pub url: String,
pub sha: String,
}
#[derive(Debug, Deserialize)]
pub struct UserStamp {
pub name: String,
pub email: String,
pub date: String,
}