pub(crate) mod detail;
use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use strum::{AsRefStr, Display, EnumString, IntoStaticStr, VariantNames};
use crate::api::v2::solution::{MentoringStatus, Solution, Status};
use crate::api::v2::tests;
#[derive(Debug, Clone, Default, Builder)]
#[builder(
derive(Debug),
default,
setter(strip_option),
build_fn(private, name = "fallible_build", error = "detail::FiltersBuilderError")
)]
pub struct Filters<'a> {
#[builder(setter(into))]
pub criteria: Option<&'a str>,
#[builder(setter(into))]
pub track: Option<&'a str>,
pub status: Option<Status>,
pub mentoring_status: Option<MentoringStatus>,
pub is_out_of_date: Option<bool>,
#[builder(setter(into, each(name = "published_iteration_tests_status")))]
pub published_iteration_tests_statuses: Vec<tests::Status>,
#[builder(setter(into, each(name = "published_iteration_head_tests_status")))]
pub published_iteration_head_tests_statuses: Vec<tests::Status>,
}
impl<'a> Filters<'a> {
#[cfg_attr(not(coverage), tracing::instrument(level = "trace"))]
pub fn builder() -> FiltersBuilder<'a> {
FiltersBuilder::default()
}
}
impl<'a> FiltersBuilder<'a> {
#[cfg_attr(not(coverage), tracing::instrument(level = "trace"))]
pub fn out_of_date(&mut self) -> &mut Self {
self.is_out_of_date(true)
}
#[cfg_attr(not(coverage), tracing::instrument(level = "trace"))]
pub fn up_to_date(&mut self) -> &mut Self {
self.is_out_of_date(false)
}
#[cfg_attr(not(coverage), tracing::instrument(ret, level = "trace"))]
pub fn build(&self) -> Filters<'a> {
self.fallible_build()
.expect("All fields should have had default values")
}
}
#[derive(Debug, Copy, Clone)]
pub struct Paging {
pub page: i64,
pub per_page: Option<i64>,
}
impl Paging {
#[cfg_attr(not(coverage), tracing::instrument(ret, level = "trace"))]
pub fn for_page(page: i64) -> Self {
Self { page, per_page: None }
}
#[cfg_attr(not(coverage), tracing::instrument(ret, level = "trace"))]
pub fn and_per_page(self, per_page: i64) -> Self {
Self { page: self.page, per_page: Some(per_page) }
}
}
#[derive(
Debug,
Default,
Copy,
Clone,
PartialEq,
Eq,
Serialize,
Deserialize,
AsRefStr,
Display,
EnumString,
IntoStaticStr,
VariantNames,
)]
#[serde(rename_all = "snake_case")]
#[strum(serialize_all = "snake_case")]
pub enum SortOrder {
NewestFirst,
OldestFirst,
#[default]
MostStarred,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Response {
pub results: Vec<Solution>,
pub meta: ResponseMeta,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ResponseMeta {
pub current_page: i64,
pub total_count: i64,
pub total_pages: i64,
}