#![warn(missing_docs)]
#![warn(clippy::must_use_candidate)]
#![deny(rustdoc::broken_intra_doc_links)]
#![cfg_attr(docsrs, feature(doc_cfg))]
pub mod de;
pub mod fetch;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "serde")]
use serde_json::Value;
#[cfg(feature = "serde")]
use std::collections::BTreeMap;
#[cfg(feature = "serde")]
use crate::de::{de_numstring, deserialize_course_groups, deserialize_level_order};
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct BmsTable {
pub header: BmsTableHeader,
pub data: BmsTableData,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct BmsTableHeader {
pub name: String,
pub symbol: String,
pub data_url: String,
#[cfg_attr(
feature = "serde",
serde(default, deserialize_with = "deserialize_course_groups")
)]
pub course: Vec<Vec<CourseInfo>>,
#[cfg_attr(
feature = "serde",
serde(default, deserialize_with = "deserialize_level_order")
)]
pub level_order: Vec<String>,
#[cfg(feature = "serde")]
#[cfg_attr(feature = "serde", serde(flatten))]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(transparent))]
pub struct BmsTableData {
pub charts: Vec<ChartItem>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize))]
pub struct CourseInfo {
pub name: String,
#[cfg_attr(feature = "serde", serde(default))]
pub constraint: Vec<String>,
#[cfg_attr(feature = "serde", serde(default))]
pub trophy: Vec<Trophy>,
#[cfg_attr(feature = "serde", serde(default))]
pub charts: Vec<ChartItem>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct ChartItem {
#[cfg_attr(feature = "serde", serde(default, deserialize_with = "de_numstring"))]
pub level: String,
pub md5: Option<String>,
pub sha256: Option<String>,
pub title: Option<String>,
pub subtitle: Option<String>,
pub artist: Option<String>,
pub subartist: Option<String>,
pub url: Option<String>,
pub url_diff: Option<String>,
#[cfg(feature = "serde")]
#[cfg_attr(feature = "serde", serde(flatten))]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Trophy {
pub name: String,
pub missrate: f64,
pub scorerate: f64,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct BmsTableRaw {
#[cfg(feature = "scraper")]
pub header_json_url: url::Url,
pub header_raw: String,
#[cfg(feature = "scraper")]
pub data_json_url: url::Url,
pub data_raw: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct BmsTableInfo {
pub name: String,
pub symbol: String,
#[cfg(feature = "scraper")]
pub url: url::Url,
#[cfg(not(feature = "scraper"))]
pub url: String,
#[cfg(feature = "serde")]
#[cfg_attr(feature = "serde", serde(flatten))]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(transparent))]
pub struct BmsTableList {
pub listes: Vec<BmsTableInfo>,
}