use serde::{Deserialize, Serialize};
use time::Date;
use url::Url;
use CardSetResource::{Filter, WithTcgPlayerId};
use crate::HttpResource;
use crate::resources::ResourceKind;
pub enum CardSetListResource {
All,
}
pub enum CardSetResource<'a> {
Filter(&'a str),
WithTcgPlayerId(&'a str),
}
impl HttpResource<CardSetList> for CardSetListResource {
fn path(&self) -> String {
match self {
_ => format!("sets")
}
}
}
impl<'a> HttpResource<CardSet> for CardSetResource<'a> {
fn path(&self) -> String {
let path = "sets";
match self {
Filter(by) => format!("{}/{}", path, by),
WithTcgPlayerId(id) => format!("{}/tcgplayer/{}", path, id),
}
}
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
pub struct CardSetList {
#[serde(rename = "object")]
pub kind: ResourceKind,
pub has_more: bool,
pub data: Vec<CardSet>,
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
pub struct CardSet {
#[serde(rename = "object")]
pub item_kind: ResourceKind,
pub id: String,
pub code: String,
pub mtgo_code: Option<String>,
pub arena_code: Option<String>,
pub name: String,
pub uri: Url,
pub scryfall_uri: Url,
pub search_uri: Url,
pub released_at: Date,
#[serde(rename = "set_type")]
pub kind: SetKind,
pub card_count: i64,
pub digital: bool,
pub nonfoil_only: bool,
pub foil_only: bool,
pub icon_svg_uri: Url,
pub tcgplayer_id: Option<i64>,
pub parent_set_code: Option<String>,
pub block_code: Option<String>,
pub block: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum SetKind {
Alchemy,
Archenemy,
Arsenal,
Box,
Commander,
Core,
DraftInnovation,
DuelDeck,
Expansion,
FromTheVault,
Funny,
Masterpiece,
Masters,
Memorabilia,
Planechase,
PremiumDeck,
Promo,
Spellbook,
Starter,
Token,
TreasureChest,
Vanguard,
}
#[cfg(test)]
mod tests {
use super::*;
use reqwest::Method;
use rstest::rstest;
#[rstest]
fn card_set_list_resource_should_return_path_and_method() {
let resource = CardSetListResource::All;
assert_eq!("sets", resource.path());
assert_eq!(Method::GET, resource.method());
}
#[rstest]
#[case::filter(CardSetResource::Filter("id"), "sets/id")]
#[case::with_tcgplayerid(CardSetResource::WithTcgPlayerId("id"), "sets/tcgplayer/id")]
fn card_set_resource_should_return_path_and_method(
#[case] resource: CardSetResource,
#[case] expected: &str
) {
assert_eq!(expected, resource.path());
assert_eq!(Method::GET, resource.method());
}
}