use std::fmt::{Display, Formatter};
use serde::{Deserialize, Serialize};
use url::Url;
use crate::id;
pub use self::branch::PullRequestBranch;
mod branch;
id!(
PullRequestId
);
id!(
PullRequestNumber
);
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Deserialize, Serialize)]
pub struct PullRequest {
id: PullRequestId,
number: PullRequestNumber,
url: Url,
head: PullRequestBranch,
base: PullRequestBranch,
}
impl PullRequest {
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn id(&self) -> PullRequestId {
self.id
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn number(&self) -> PullRequestNumber {
self.number
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn url(&self) -> &Url {
&self.url
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn head(&self) -> &PullRequestBranch {
&self.head
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn base(&self) -> &PullRequestBranch {
&self.base
}
}
impl Display for PullRequest {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "#{}", self.number)
}
}
#[cfg(test)]
mod tests {
use super::PullRequest;
#[test]
fn trait_deserialize() {
let pr: PullRequest = serde_json::from_str(include_str!(
"../../../tests/fixtures/resource/pull_request.json"
))
.unwrap();
assert_eq!(27, pr.number().get());
}
#[test]
fn trait_display() {
let pr: PullRequest = serde_json::from_str(include_str!(
"../../../tests/fixtures/resource/pull_request.json"
))
.unwrap();
assert_eq!("#27", pr.to_string());
}
#[test]
fn trait_send() {
fn assert_send<T: Send>() {}
assert_send::<PullRequest>();
}
#[test]
fn trait_sync() {
fn assert_sync<T: Sync>() {}
assert_sync::<PullRequest>();
}
}