use serde::{Deserialize, Serialize}; use utoipa::ToSchema; #[derive(Copy, Clone, Deserialize, Serialize, ToSchema)] pub enum ReviewState { Draft, Open, Dropped, Closed, } impl TryFrom for ReviewState { type Error = &'static str; fn try_from(value: u8) -> Result { match value { 0 => Ok(ReviewState::Draft), 1 => Ok(ReviewState::Open), 2 => Ok(ReviewState::Dropped), 3 => Ok(ReviewState::Closed), _ => Err("Invalid review state"), } } } #[derive(Copy, Clone, Deserialize, Serialize, ToSchema)] pub enum Rewrite { Disabled, History, Rebase, } impl TryFrom for Rewrite { type Error = &'static str; fn try_from(value: u8) -> Result { match value { 0 => Ok(Rewrite::Disabled), 1 => Ok(Rewrite::History), 2 => Ok(Rewrite::Rebase), _ => Err("Invalid review state"), } } } #[derive(Copy, Clone, Debug, Deserialize, PartialEq, Serialize, ToSchema)] pub enum UserReviewRole { Reviewer, Watcher, None, } impl TryFrom for UserReviewRole { type Error = &'static str; fn try_from(value: u8) -> Result { match value { 0 => Ok(UserReviewRole::None), 1 => Ok(UserReviewRole::Reviewer), 2 => Ok(UserReviewRole::Watcher), _ => Err("Invalid role"), } } } impl From for u8 { fn from(value: UserReviewRole) -> u8 { match value { UserReviewRole::None => 0, UserReviewRole::Reviewer => 1, UserReviewRole::Watcher => 2, } } } #[derive(Debug, Deserialize, Serialize, PartialEq, ToSchema)] pub struct User { #[schema(example = "jsmith")] pub id: String, #[schema(example = "John Smith")] pub name: String, #[schema(example = true)] pub active: bool, } #[derive(Deserialize, Serialize, ToSchema)] pub struct Users { #[schema(example = 0u32)] pub offset: u32, #[schema(example = 10u32)] pub limit: u32, #[schema(example = 42u32)] pub total_count: u32, #[schema(example = true)] pub more: bool, pub users: Vec, } #[derive(Serialize, ToSchema)] pub struct ReviewUserEntry { pub user: User, #[schema(example = UserReviewRole::Reviewer)] pub role: UserReviewRole, } #[derive(Serialize, ToSchema)] pub struct Review { #[schema(example = 1000u64)] pub id: u64, #[schema(example = "FAKE-512: Add more features")] pub title: String, #[schema(example = "We're adding more features because features are what we want.")] pub description: String, pub owner: User, pub users: Vec, #[schema(example = ReviewState::Open)] pub state: ReviewState, #[schema(example = 37.5)] pub progress: f32, #[schema(example = "r/user/TASK-123456")] pub branch: String, #[schema(example = false)] pub archived: bool, } #[derive(Deserialize, Serialize, ToSchema)] pub struct ReviewEntry { #[schema(example = 1000u64)] pub id: u64, #[schema(example = "FAKE-512: Add more features")] pub title: String, pub owner: User, #[schema(example = ReviewState::Open)] pub state: ReviewState, #[schema(example = 37.5)] pub progress: f32, #[schema(example = "r/user/TASK-123456")] pub branch: String, } #[derive(Deserialize, Serialize, ToSchema)] pub struct Reviews { #[schema(example = 0u32)] pub offset: u32, #[schema(example = 10u32)] pub limit: u32, #[schema(example = 42u32)] pub total_count: u32, #[schema(example = true)] pub more: bool, pub reviews: Vec, } #[derive(Debug, Deserialize, PartialEq, Serialize, ToSchema)] pub struct ProjectUserEntry { pub user: User, #[schema(example = UserReviewRole::Reviewer)] pub default_role: UserReviewRole, #[schema(example = false)] pub maintainer: bool, } #[derive(Deserialize, Serialize, ToSchema)] pub struct ProjectUserEntryData { #[schema(example = UserReviewRole::Reviewer)] pub default_role: Option, #[schema(example = false)] pub maintainer: Option, } #[derive(Debug, Deserialize, PartialEq, Serialize, ToSchema)] pub struct Project { #[schema(example = "fake")] pub id: String, #[schema(example = "FAKE: Features All Kids Erase")] pub title: String, #[schema(example = "Example project")] pub description: String, #[schema(example = "ssh://git.example.org/srv/git/")] pub remote: String, #[schema(example = "b3BlbNNz...AQIDBA==")] pub remote_key_abbrev: String, #[schema(example = "main")] pub main_branch: String, pub users: Vec, } #[derive(Deserialize, Serialize, ToSchema)] pub struct ProjectData<'r> { #[schema(example = "FAKE: Features All Kids Erase")] pub title: Option<&'r str>, #[schema(example = "Example project")] pub description: Option<&'r str>, #[schema(example = "ssh://git.example.org/srv/git/")] pub remote: Option<&'r str>, #[schema(example = "b3BlbNNz...AQIDBA==")] pub remote_key: Option, #[schema(example = "main")] pub main_branch: Option<&'r str>, } #[derive(Deserialize, Serialize, ToSchema)] pub struct ProjectEntry { #[schema(example = "fake")] pub id: String, #[schema(example = "FAKE: Features All Kids Erase")] pub title: String, } #[derive(Deserialize, Serialize, ToSchema)] pub struct Projects { #[schema(example = 0u32)] pub offset: u32, #[schema(example = 10u32)] pub limit: u32, #[schema(example = 1u32)] pub total_count: u32, #[schema(example = false)] pub more: bool, pub projects: Vec, } #[derive(Deserialize, Serialize, ToSchema)] pub struct StatusResponse { pub ok: bool, #[serde( skip_serializing_if = "Option::is_none", // &'static str is problematic for serde, only used in tests anyway. skip_deserializing, )] pub error: Option<&'static str>, } #[derive(Debug, Deserialize, PartialEq, Serialize, ToSchema)] pub struct UserKey { #[schema(example = 1u64)] pub id: u64, #[schema(example = "ssh-rsa")] pub kind: String, #[schema(example = "AAAAfoobar==")] pub data: String, #[schema(example = "user@host 1970-01-01")] pub comment: String, } #[derive(Deserialize, Serialize, ToSchema)] pub struct UserKeyData<'r> { #[schema(example = "ssh-rsa")] pub kind: &'r str, #[schema(example = "AAAAfoobar==")] pub data: String, #[schema(example = "user@host 1970-01-01")] pub comment: Option<&'r str>, } #[derive(Deserialize, Serialize, ToSchema)] pub struct UserKeys { #[schema(example = 0u32)] pub offset: u32, #[schema(example = 10u32)] pub limit: u32, #[schema(example = 2u32)] pub total_count: u32, #[schema(example = false)] pub more: bool, pub keys: Vec, }