1#![warn(missing_docs)]
37#![warn(clippy::must_use_candidate)]
38#![deny(rustdoc::broken_intra_doc_links)]
39#![cfg_attr(docsrs, feature(doc_cfg))]
40
41pub mod de;
42pub mod fetch;
43
44#[cfg(feature = "serde")]
45use serde::{Deserialize, Serialize};
46#[cfg(feature = "serde")]
47use serde_json::Value;
48use std::collections::HashMap;
49
50#[derive(Debug, Clone, PartialEq)]
54#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
55pub struct BmsTable {
56 pub header: BmsTableHeader,
58 pub data: BmsTableData,
60}
61
62#[derive(Debug, Clone, PartialEq)]
66#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
67pub struct BmsTableHeader {
68 pub name: String,
70 pub symbol: String,
72 pub data_url: String,
74 #[cfg_attr(
76 feature = "serde",
77 serde(default, deserialize_with = "crate::de::deserialize_course_groups")
78 )]
79 pub course: Vec<Vec<CourseInfo>>,
80 #[cfg_attr(
82 feature = "serde",
83 serde(default, deserialize_with = "crate::de::deserialize_level_order")
84 )]
85 pub level_order: Vec<String>,
86 #[cfg(feature = "serde")]
88 #[cfg_attr(feature = "serde", serde(flatten))]
89 pub extra: HashMap<String, Value>,
90}
91
92#[derive(Debug, Clone, PartialEq, Eq)]
96#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
97#[cfg_attr(feature = "serde", serde(transparent))]
98pub struct BmsTableData {
99 pub charts: Vec<ChartItem>,
101}
102
103#[derive(Debug, Clone, PartialEq)]
108#[cfg_attr(feature = "serde", derive(Serialize))]
109pub struct CourseInfo {
110 pub name: String,
112 #[cfg_attr(feature = "serde", serde(default))]
114 pub constraint: Vec<String>,
115 #[cfg_attr(feature = "serde", serde(default))]
117 pub trophy: Vec<Trophy>,
118 #[cfg_attr(feature = "serde", serde(default))]
120 pub charts: Vec<ChartItem>,
121}
122
123#[derive(Debug, Clone, PartialEq, Eq)]
128#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
129pub struct ChartItem {
130 pub level: String,
132 #[cfg_attr(
134 feature = "serde",
135 serde(default, deserialize_with = "crate::de::empty_string_as_none")
136 )]
137 pub md5: Option<String>,
138 #[cfg_attr(
140 feature = "serde",
141 serde(default, deserialize_with = "crate::de::empty_string_as_none")
142 )]
143 pub sha256: Option<String>,
144 #[cfg_attr(
146 feature = "serde",
147 serde(default, deserialize_with = "crate::de::empty_string_as_none")
148 )]
149 pub title: Option<String>,
150 #[cfg_attr(
152 feature = "serde",
153 serde(default, deserialize_with = "crate::de::empty_string_as_none")
154 )]
155 pub subtitle: Option<String>,
156 #[cfg_attr(
158 feature = "serde",
159 serde(default, deserialize_with = "crate::de::empty_string_as_none")
160 )]
161 pub artist: Option<String>,
162 #[cfg_attr(
164 feature = "serde",
165 serde(default, deserialize_with = "crate::de::empty_string_as_none")
166 )]
167 pub subartist: Option<String>,
168 #[cfg_attr(
170 feature = "serde",
171 serde(default, deserialize_with = "crate::de::empty_string_as_none")
172 )]
173 pub url: Option<String>,
174 #[cfg_attr(
176 feature = "serde",
177 serde(default, deserialize_with = "crate::de::empty_string_as_none")
178 )]
179 pub url_diff: Option<String>,
180 #[cfg(feature = "serde")]
182 #[cfg_attr(feature = "serde", serde(flatten))]
183 pub extra: HashMap<String, Value>,
184}
185
186#[derive(Debug, Clone, PartialEq)]
190#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
191pub struct Trophy {
192 pub name: String,
194 pub missrate: f64,
196 pub scorerate: f64,
198}
199
200#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
202pub struct BmsTableRaw {
203 pub header_raw: String,
205 pub data_raw: String,
207}
208
209#[derive(Debug, Clone, PartialEq, Eq)]
214#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
215pub struct BmsTableIndexItem {
216 pub name: String,
218 pub symbol: String,
220 pub url: url::Url,
222 #[cfg(feature = "serde")]
224 #[cfg_attr(feature = "serde", serde(flatten))]
225 pub extra: HashMap<String, Value>,
226}
227
228#[derive(Debug, Clone, PartialEq, Eq)]
233#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
234#[cfg_attr(feature = "serde", serde(transparent))]
235pub struct BmsTableIndex {
236 pub indexes: Vec<BmsTableIndexItem>,
238}