use cloud_sdk::transport::StatusCode;
use crate::{ActionFixture, FixtureBody, PaginationFixture, RateLimitFixture};
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum FixtureKind {
Success,
Pagination,
Action,
RateLimit,
Error,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ResponseFixtureError {
NonErrorStatus,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct ResponseFixture<'a> {
kind: FixtureKind,
status: StatusCode,
body: FixtureBody<'a>,
pagination: Option<PaginationFixture>,
action: Option<ActionFixture>,
rate_limit: Option<RateLimitFixture>,
}
impl<'a> ResponseFixture<'a> {
#[must_use]
pub const fn success(body: FixtureBody<'a>) -> Self {
Self::new(FixtureKind::Success, StatusCode::OK, body)
}
#[must_use]
pub const fn paginated(body: FixtureBody<'a>, pagination: PaginationFixture) -> Self {
let mut fixture = Self::new(FixtureKind::Pagination, StatusCode::OK, body);
fixture.pagination = Some(pagination);
fixture
}
#[must_use]
pub const fn action(body: FixtureBody<'a>, action: ActionFixture) -> Self {
let mut fixture = Self::new(FixtureKind::Action, StatusCode::OK, body);
fixture.action = Some(action);
fixture
}
#[must_use]
pub const fn rate_limited(body: FixtureBody<'a>, rate_limit: RateLimitFixture) -> Self {
let mut fixture = Self::new(FixtureKind::RateLimit, StatusCode::TOO_MANY_REQUESTS, body);
fixture.rate_limit = Some(rate_limit);
fixture
}
#[must_use]
pub const fn with_rate_limit(mut self, rate_limit: RateLimitFixture) -> Self {
self.rate_limit = Some(rate_limit);
self
}
pub const fn error(
status: StatusCode,
body: FixtureBody<'a>,
) -> Result<Self, ResponseFixtureError> {
if !status.is_error() {
return Err(ResponseFixtureError::NonErrorStatus);
}
Ok(Self::new(FixtureKind::Error, status, body))
}
const fn new(kind: FixtureKind, status: StatusCode, body: FixtureBody<'a>) -> Self {
Self {
kind,
status,
body,
pagination: None,
action: None,
rate_limit: None,
}
}
#[must_use]
pub const fn kind(self) -> FixtureKind {
self.kind
}
#[must_use]
pub const fn status(self) -> StatusCode {
self.status
}
#[must_use]
pub const fn body(self) -> FixtureBody<'a> {
self.body
}
#[must_use]
pub const fn pagination(self) -> Option<PaginationFixture> {
self.pagination
}
#[must_use]
pub const fn action_metadata(self) -> Option<ActionFixture> {
self.action
}
#[must_use]
pub const fn rate_limit(self) -> Option<RateLimitFixture> {
self.rate_limit
}
}