use serde::{Deserialize, Serialize};
use time::Date;
use RulingListResource::{ByArenaId, ByCardId, ByMtgoId, ByMultiverseId, BySetCode};
use crate::HttpResource;
use crate::resources::ResourceKind;
pub enum RulingListResource<'a> {
ByCardId(&'a str),
BySetCode(&'a str, i32),
ByArenaId(i32),
ByMtgoId(i32),
ByMultiverseId(i32),
}
impl<'a> HttpResource<RulingList> for RulingListResource<'a> {
fn path(&self) -> String {
format!("cards/{}/rulings", match self {
ByCardId(id) => format!("{id}"),
BySetCode(code, num) => format!("{code}/{num}"),
ByArenaId(id) => format!("arena/{id}"),
ByMtgoId(id) => format!("mtgo/{id}"),
ByMultiverseId(id) => format!("multiverse/{id}"),
})
}
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
pub struct RulingList {
#[serde(rename = "object")]
pub kind: ResourceKind,
pub has_more: bool,
pub data: Vec<Ruling>,
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
pub struct Ruling {
#[serde(rename = "object")]
pub kind: ResourceKind,
pub oracle_id: String,
pub source: String,
pub published_at: Date,
pub comment: String,
}
#[cfg(test)]
mod tests {
use rstest::rstest;
use super::*;
use reqwest::Method;
#[rstest]
#[case::by_card_id(RulingListResource::ByCardId("id"), "cards/id/rulings")]
#[case::by_set_code(RulingListResource::BySetCode("code", 123), "cards/code/123/rulings")]
#[case::by_arena_id(RulingListResource::ByArenaId(123), "cards/arena/123/rulings")]
#[case::by_mtgo_id(RulingListResource::ByMtgoId(123), "cards/mtgo/123/rulings")]
#[case::by_multiverse_id(RulingListResource::ByMultiverseId(123), "cards/multiverse/123/rulings")]
fn ruling_list_resource_should_return_path_and_method(
#[case] resource: RulingListResource,
#[case] expected: &str
) {
assert_eq!(expected, resource.path());
assert_eq!(Method::GET, resource.method());
}
}