use derive_builder::Builder;
use crate::api::common::{AccessLevel, NameOrId, SortOrder, VisibilityLevel};
use crate::api::endpoint_prelude::*;
use crate::api::ParamValue;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SharedGroupProjectsOrderBy {
Id,
Name,
Path,
CreatedAt,
UpdatedAt,
LastActivityAt,
}
#[allow(clippy::derivable_impls)]
impl Default for SharedGroupProjectsOrderBy {
fn default() -> Self {
SharedGroupProjectsOrderBy::CreatedAt
}
}
impl SharedGroupProjectsOrderBy {
fn as_str(self) -> &'static str {
match self {
SharedGroupProjectsOrderBy::Id => "id",
SharedGroupProjectsOrderBy::Name => "name",
SharedGroupProjectsOrderBy::Path => "path",
SharedGroupProjectsOrderBy::CreatedAt => "created_at",
SharedGroupProjectsOrderBy::UpdatedAt => "updated_at",
SharedGroupProjectsOrderBy::LastActivityAt => "last_activity_at",
}
}
}
impl ParamValue<'static> for SharedGroupProjectsOrderBy {
fn as_value(&self) -> Cow<'static, str> {
self.as_str().into()
}
}
#[derive(Debug, Clone, Builder)]
#[builder(setter(strip_option))]
pub struct SharedGroupProjects<'a> {
#[builder(setter(into))]
id: NameOrId<'a>,
#[builder(default)]
archived: Option<bool>,
#[builder(default)]
visibility: Option<VisibilityLevel>,
#[builder(default)]
order_by: Option<SharedGroupProjectsOrderBy>,
#[builder(default)]
sort: Option<SortOrder>,
#[builder(setter(into), default)]
search: Option<Cow<'a, str>>,
#[builder(default)]
simple: Option<bool>,
#[builder(default)]
starred: Option<bool>,
#[builder(default)]
with_issues_enabled: Option<bool>,
#[builder(default)]
with_merge_requests_enabled: Option<bool>,
#[builder(default)]
min_access_level: Option<AccessLevel>,
#[builder(default)]
with_custom_attributes: Option<bool>,
}
impl<'a> SharedGroupProjects<'a> {
pub fn builder() -> SharedGroupProjectsBuilder<'a> {
SharedGroupProjectsBuilder::default()
}
}
impl<'a> Endpoint for SharedGroupProjects<'a> {
fn method(&self) -> Method {
Method::GET
}
fn endpoint(&self) -> Cow<'static, str> {
format!("groups/{}/projects/shared", self.id).into()
}
fn parameters(&self) -> QueryParams {
let mut params = QueryParams::default();
params
.push_opt("archived", self.archived)
.push_opt("visibility", self.visibility)
.push_opt("order_by", self.order_by)
.push_opt("sort", self.sort)
.push_opt("search", self.search.as_ref())
.push_opt("simple", self.simple)
.push_opt("starred", self.starred)
.push_opt("with_issues_enabled", self.with_issues_enabled)
.push_opt(
"with_merge_requests_enabled",
self.with_merge_requests_enabled,
)
.push_opt(
"min_access_level",
self.min_access_level.map(AccessLevel::as_u64),
)
.push_opt("with_custom_attributes", self.with_custom_attributes);
params
}
}
impl<'a> Pageable for SharedGroupProjects<'a> {}
#[cfg(test)]
mod tests {
use crate::api::common::{AccessLevel, SortOrder, VisibilityLevel};
use crate::api::groups::projects::{
SharedGroupProjects, SharedGroupProjectsBuilderError, SharedGroupProjectsOrderBy,
};
use crate::api::{self, Query};
use crate::test::client::{ExpectedUrl, SingleTestClient};
#[test]
fn order_by_default() {
assert_eq!(
SharedGroupProjectsOrderBy::default(),
SharedGroupProjectsOrderBy::CreatedAt,
);
}
#[test]
fn order_by_as_str() {
let items = &[
(SharedGroupProjectsOrderBy::Id, "id"),
(SharedGroupProjectsOrderBy::Name, "name"),
(SharedGroupProjectsOrderBy::Path, "path"),
(SharedGroupProjectsOrderBy::CreatedAt, "created_at"),
(SharedGroupProjectsOrderBy::UpdatedAt, "updated_at"),
(
SharedGroupProjectsOrderBy::LastActivityAt,
"last_activity_at",
),
];
for (i, s) in items {
assert_eq!(i.as_str(), *s);
}
}
#[test]
fn group_is_needed() {
let err = SharedGroupProjects::builder().build().unwrap_err();
crate::test::assert_missing_field!(err, SharedGroupProjectsBuilderError, "id");
}
#[test]
fn group_is_sufficient() {
SharedGroupProjects::builder().id(1).build().unwrap();
}
#[test]
fn endpoint() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects/shared")
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = SharedGroupProjects::builder()
.id("group/subgroup")
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_archived() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects/shared")
.add_query_params(&[("archived", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = SharedGroupProjects::builder()
.id("group/subgroup")
.archived(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_visibility() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects/shared")
.add_query_params(&[("visibility", "private")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = SharedGroupProjects::builder()
.id("group/subgroup")
.visibility(VisibilityLevel::Private)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_order_by() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects/shared")
.add_query_params(&[("order_by", "id")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = SharedGroupProjects::builder()
.id("group/subgroup")
.order_by(SharedGroupProjectsOrderBy::Id)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_sort() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects/shared")
.add_query_params(&[("sort", "asc")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = SharedGroupProjects::builder()
.id("group/subgroup")
.sort(SortOrder::Ascending)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_search() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects/shared")
.add_query_params(&[("search", "name")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = SharedGroupProjects::builder()
.id("group/subgroup")
.search("name")
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_simple() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects/shared")
.add_query_params(&[("simple", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = SharedGroupProjects::builder()
.id("group/subgroup")
.simple(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_starred() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects/shared")
.add_query_params(&[("starred", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = SharedGroupProjects::builder()
.id("group/subgroup")
.starred(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_with_issues_enabled() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects/shared")
.add_query_params(&[("with_issues_enabled", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = SharedGroupProjects::builder()
.id("group/subgroup")
.with_issues_enabled(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_with_merge_requests_enabled() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects/shared")
.add_query_params(&[("with_merge_requests_enabled", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = SharedGroupProjects::builder()
.id("group/subgroup")
.with_merge_requests_enabled(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_min_access_level() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects/shared")
.add_query_params(&[("min_access_level", "30")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = SharedGroupProjects::builder()
.id("group/subgroup")
.min_access_level(AccessLevel::Developer)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
#[test]
fn endpoint_with_custom_attributes() {
let endpoint = ExpectedUrl::builder()
.endpoint("groups/group%2Fsubgroup/projects/shared")
.add_query_params(&[("with_custom_attributes", "true")])
.build()
.unwrap();
let client = SingleTestClient::new_raw(endpoint, "");
let endpoint = SharedGroupProjects::builder()
.id("group/subgroup")
.with_custom_attributes(true)
.build()
.unwrap();
api::ignore(endpoint).query(&client).unwrap();
}
}