mod set_code;
mod set_type;
use chrono::NaiveDate;
use percent_encoding::{percent_encode, NON_ALPHANUMERIC};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
pub use self::set_code::SetCode;
pub use self::set_type::SetType;
use crate::card::Card;
use crate::list::{List, ListIter};
use crate::uri::Uri;
use crate::util::SETS_URL;
#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)]
#[cfg_attr(test, serde(deny_unknown_fields))]
#[non_exhaustive]
pub struct Set {
pub id: Uuid,
pub code: SetCode,
pub mtgo_code: Option<String>,
pub arena_code: Option<String>,
pub tcgplayer_id: Option<u64>,
pub name: String,
pub set_type: SetType,
pub released_at: Option<NaiveDate>,
pub block_code: Option<String>,
pub block: Option<String>,
pub parent_set_code: Option<String>,
pub card_count: usize,
pub printed_size: Option<usize>,
pub digital: bool,
pub foil_only: bool,
pub nonfoil_only: bool,
pub scryfall_uri: String,
pub uri: Uri<Set>,
pub icon_svg_uri: String,
pub search_uri: Uri<List<Card>>,
#[cfg(test)]
#[serde(rename = "object")]
_object: String,
}
impl Set {
pub async fn all() -> crate::Result<ListIter<Set>> {
let mut url = SETS_URL.clone();
url.query_pairs_mut().append_pair("page", "1");
Uri::from(url).fetch_iter().await
}
pub async fn code(code: &str) -> crate::Result<Set> {
Uri::from(SETS_URL.join(&percent_encode(code.as_bytes(), NON_ALPHANUMERIC).to_string())?)
.fetch()
.await
}
pub async fn tcgplayer<T: std::fmt::Display>(code: T) -> crate::Result<Set> {
Uri::from(
SETS_URL
.join("tcgplayer/")?
.join(&percent_encode(code.to_string().as_bytes(), NON_ALPHANUMERIC).to_string())?,
)
.fetch()
.await
}
pub async fn uuid(uuid: Uuid) -> crate::Result<Set> {
Uri::from(SETS_URL.join(&uuid.to_string())?).fetch().await
}
pub async fn cards(&self) -> crate::Result<ListIter<Card>> {
self.search_uri.fetch_iter().await
}
}