use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use super::{ProviderApp, ReviewActor, ReviewFinding, ReviewId};
#[derive(Clone, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
pub struct ReviewedRevision {
pub head_sha: String,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ReviewDisposition {
Approved,
ChangesRequested,
Commented,
Dismissed,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ReviewRelationship {
ChangeAuthor,
Other,
Unknown,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ReviewAuthor {
ChangeAuthor,
Other(ReviewActor),
Unknown(ReviewActor),
}
impl ReviewAuthor {
#[must_use]
pub const fn relationship(&self) -> ReviewRelationship {
match self {
Self::ChangeAuthor => ReviewRelationship::ChangeAuthor,
Self::Other(_) => ReviewRelationship::Other,
Self::Unknown(_) => ReviewRelationship::Unknown,
}
}
#[must_use]
pub fn actor<'a>(&'a self, change_author: &'a ReviewActor) -> &'a ReviewActor {
match self {
Self::ChangeAuthor => change_author,
Self::Other(actor) | Self::Unknown(actor) => actor,
}
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ReviewState {
Draft,
Submitted {
disposition: ReviewDisposition,
submitted_at: DateTime<Utc>,
},
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct Review {
pub id: ReviewId,
pub author: ReviewAuthor,
pub via_app: Option<ProviderApp>,
pub revision: ReviewedRevision,
pub state: ReviewState,
pub summary: Option<String>,
pub findings: Vec<ReviewFinding>,
}