use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use super::{ReviewActor, ReviewCommentId, ReviewThreadId};
platform_number!(ReviewLine);
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ReviewThreadStatus {
Open,
Resolved,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ReviewComment {
pub id: ReviewCommentId,
pub author: ReviewActor,
pub body: String,
pub created_at: DateTime<Utc>,
pub updated_at: Option<DateTime<Utc>>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ReviewLineRange {
pub start: Option<ReviewLine>,
pub end: ReviewLine,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ReviewDiffSide {
Left,
Right,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ReviewAnchor {
File,
Lines {
side: ReviewDiffSide,
original: ReviewLineRange,
current: Option<ReviewLineRange>,
},
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ReviewLocation {
pub path: String,
pub anchor: ReviewAnchor,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ReviewThread {
pub id: ReviewThreadId,
pub location: ReviewLocation,
pub outdated: bool,
pub status: ReviewThreadStatus,
pub comment: ReviewComment,
pub replies: Vec<ReviewComment>,
}