use std::borrow::Cow;
use std::collections::BTreeSet;
use crate::api::{ParamValue, QueryParams};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum MergeRequestState {
Opened,
Closed,
Locked,
Merged,
}
impl MergeRequestState {
fn as_str(self) -> &'static str {
match self {
MergeRequestState::Opened => "opened",
MergeRequestState::Closed => "closed",
MergeRequestState::Locked => "locked",
MergeRequestState::Merged => "merged",
}
}
}
impl ParamValue<'static> for MergeRequestState {
fn as_value(&self) -> Cow<'static, str> {
self.as_str().into()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum MergeRequestView {
Simple,
}
impl MergeRequestView {
fn as_str(self) -> &'static str {
match self {
MergeRequestView::Simple => "simple",
}
}
}
impl ParamValue<'static> for MergeRequestView {
fn as_value(&self) -> Cow<'static, str> {
self.as_str().into()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum MergeRequestScope {
CreatedByMe,
AssignedToMe,
All,
ReviewsForMe,
}
impl MergeRequestScope {
fn as_str(self) -> &'static str {
match self {
MergeRequestScope::CreatedByMe => "created_by_me",
MergeRequestScope::AssignedToMe => "assigned_to_me",
MergeRequestScope::All => "all",
MergeRequestScope::ReviewsForMe => "reviews_for_me",
}
}
}
impl ParamValue<'static> for MergeRequestScope {
fn as_value(&self) -> Cow<'static, str> {
self.as_str().into()
}
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum MergeRequestMilestone<'a> {
None,
Any,
Named(Cow<'a, str>),
}
impl MergeRequestMilestone<'_> {
fn as_str(&self) -> &str {
match self {
MergeRequestMilestone::None => "None",
MergeRequestMilestone::Any => "Any",
MergeRequestMilestone::Named(name) => name.as_ref(),
}
}
}
impl<'a, 'b: 'a> ParamValue<'a> for &'b MergeRequestMilestone<'a> {
fn as_value(&self) -> Cow<'a, str> {
self.as_str().into()
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum MergeRequestOrderBy {
#[default]
CreatedAt,
MergedAt,
UpdatedAt,
Title,
}
impl MergeRequestOrderBy {
fn as_str(self) -> &'static str {
match self {
MergeRequestOrderBy::CreatedAt => "created_at",
MergeRequestOrderBy::MergedAt => "merged_at",
MergeRequestOrderBy::UpdatedAt => "updated_at",
MergeRequestOrderBy::Title => "title",
}
}
}
impl ParamValue<'static> for MergeRequestOrderBy {
fn as_value(&self) -> Cow<'static, str> {
self.as_str().into()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MergeRequestSearchScope {
Title,
Description,
}
impl MergeRequestSearchScope {
fn as_str(self) -> &'static str {
match self {
MergeRequestSearchScope::Title => "title",
MergeRequestSearchScope::Description => "description",
}
}
}
impl ParamValue<'static> for MergeRequestSearchScope {
fn as_value(&self) -> Cow<'static, str> {
self.as_str().into()
}
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum Assignee {
Assigned,
Unassigned,
Id(u64),
}
impl Assignee {
pub(crate) fn add_params<'a>(&'a self, params: &mut QueryParams<'a>) {
match self {
Assignee::Assigned => {
params.push("assignee_id", "Any");
},
Assignee::Unassigned => {
params.push("assignee_id", "None");
},
Assignee::Id(id) => {
params.push("assignee_id", *id);
},
}
}
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum ApproverIds {
Any,
None,
AllOf(BTreeSet<u64>),
}
impl ApproverIds {
pub(crate) fn add_params<'a>(&'a self, params: &mut QueryParams<'a>) {
match self {
ApproverIds::Any => {
params.push("approver_ids", "Any");
},
ApproverIds::None => {
params.push("approver_ids", "None");
},
ApproverIds::AllOf(ids) => {
params.extend(ids.iter().map(|&id| ("approver_ids[]", id)));
},
}
}
}
#[cfg(test)]
mod tests {
use super::{
MergeRequestMilestone, MergeRequestOrderBy, MergeRequestScope, MergeRequestState,
MergeRequestView,
};
#[test]
fn merge_request_state_as_str() {
let items = &[
(MergeRequestState::Opened, "opened"),
(MergeRequestState::Closed, "closed"),
(MergeRequestState::Locked, "locked"),
(MergeRequestState::Merged, "merged"),
];
for (i, s) in items {
assert_eq!(i.as_str(), *s);
}
}
#[test]
fn merge_request_view_as_str() {
let items = &[(MergeRequestView::Simple, "simple")];
for (i, s) in items {
assert_eq!(i.as_str(), *s);
}
}
#[test]
fn merge_request_scope_as_str() {
let items = &[
(MergeRequestScope::CreatedByMe, "created_by_me"),
(MergeRequestScope::AssignedToMe, "assigned_to_me"),
(MergeRequestScope::All, "all"),
(MergeRequestScope::ReviewsForMe, "reviews_for_me"),
];
for (i, s) in items {
assert_eq!(i.as_str(), *s);
}
}
#[test]
fn merge_request_milestone_as_str() {
let items = &[
(MergeRequestMilestone::Any, "Any"),
(MergeRequestMilestone::None, "None"),
(
MergeRequestMilestone::Named("milestone".into()),
"milestone",
),
];
for (i, s) in items {
assert_eq!(i.as_str(), *s);
}
}
#[test]
fn merge_request_order_by_default() {
assert_eq!(
MergeRequestOrderBy::default(),
MergeRequestOrderBy::CreatedAt,
);
}
#[test]
fn merge_request_order_by_as_str() {
let items = &[
(MergeRequestOrderBy::CreatedAt, "created_at"),
(MergeRequestOrderBy::MergedAt, "merged_at"),
(MergeRequestOrderBy::UpdatedAt, "updated_at"),
(MergeRequestOrderBy::Title, "title"),
];
for (i, s) in items {
assert_eq!(i.as_str(), *s);
}
}
}