use super::errors::*;
use super::types::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ApiResponse<T> {
Success(T),
Error {
#[serde(deserialize_with = "empty_object_as_vec")]
errors: Vec<String>,
},
}
pub trait IntoResponseResult {
type Err: From<ApiResponseError> + std::error::Error + std::fmt::Debug;
}
impl<T: IntoResponseResult> ApiResponse<T> {
pub fn into_result(self) -> Result<T, <T as IntoResponseResult>::Err> {
match self {
Self::Success(v) => Ok(v),
Self::Error { errors } => Err(ApiResponseError::from(errors).into()),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum LoginResponse {
Success(LoginSuccess),
CaptchaError(LoginCaptchaError),
TOTPError(LoginTOTPError),
}
impl IntoResponseResult for LoginResponse {
type Err = LoginResponseError;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TOTPResponse {
#[serde(flatten)]
pub success: LoginSuccess,
}
impl IntoResponseResult for TOTPResponse {
type Err = TOTPResponseError;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UserInfoResponse {
pub user: User,
}
impl IntoResponseResult for UserInfoResponse {
type Err = UserResponseError;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ProfileInfoResponse {
pub user: Profile,
}
impl IntoResponseResult for ProfileInfoResponse {
type Err = ApiResponseCommonErrors;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CreatedGamesResponse {
#[serde(deserialize_with = "empty_object_as_vec")]
pub games: Vec<CreatedGame>,
}
impl IntoResponseResult for CreatedGamesResponse {
type Err = ApiResponseCommonErrors;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct OwnedKeysResponse {
pub page: u64,
pub per_page: u64,
#[serde(deserialize_with = "empty_object_as_vec")]
pub owned_keys: Vec<OwnedKey>,
}
impl IntoResponseResult for OwnedKeysResponse {
type Err = ApiResponseCommonErrors;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ProfileCollectionsResponse {
#[serde(deserialize_with = "empty_object_as_vec")]
pub collections: Vec<Collection>,
}
impl IntoResponseResult for ProfileCollectionsResponse {
type Err = ApiResponseCommonErrors;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CollectionInfoResponse {
pub collection: Collection,
}
impl IntoResponseResult for CollectionInfoResponse {
type Err = CollectionResponseError;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CollectionGamesResponse {
pub page: u64,
pub per_page: u64,
#[serde(deserialize_with = "empty_object_as_vec")]
pub collection_games: Vec<CollectionGameItem>,
}
impl IntoResponseResult for CollectionGamesResponse {
type Err = CollectionResponseError;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GameInfoResponse {
pub game: Game,
}
impl IntoResponseResult for GameInfoResponse {
type Err = GameResponseError;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GameUploadsResponse {
#[serde(deserialize_with = "empty_object_as_vec")]
pub uploads: Vec<Upload>,
}
impl IntoResponseResult for GameUploadsResponse {
type Err = GameResponseError;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UploadInfoResponse {
pub upload: Upload,
}
impl IntoResponseResult for UploadInfoResponse {
type Err = UploadResponseError;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UploadBuildsResponse {
#[serde(deserialize_with = "empty_object_as_vec")]
pub builds: Vec<UploadBuild>,
}
impl IntoResponseResult for UploadBuildsResponse {
type Err = UploadResponseError;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BuildInfoResponse {
pub build: Build,
}
impl IntoResponseResult for BuildInfoResponse {
type Err = BuildResponseError;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BuildUpgradePathResponseBuilds {
#[serde(deserialize_with = "empty_object_as_vec")]
pub builds: Vec<UpgradePathBuild>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BuildUpgradePathResponse {
pub upgrade_path: BuildUpgradePathResponseBuilds,
}
impl IntoResponseResult for BuildUpgradePathResponse {
type Err = UpgradePathResponseError;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UploadScannedArchiveResponse {
pub scanned_archive: ScannedArchive,
}
impl IntoResponseResult for UploadScannedArchiveResponse {
type Err = UploadResponseError;
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BuildScannedArchiveResponse {
pub scanned_archive: ScannedArchive,
}
impl IntoResponseResult for BuildScannedArchiveResponse {
type Err = BuildResponseError;
}