1#![cfg(feature = "serde")]
3
4use crate::{BmsTableData, BmsTableHeader, ChartItem};
5use serde::ser::{SerializeMap, SerializeSeq};
6
7impl serde::Serialize for BmsTableHeader {
8 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
9 where
10 S: serde::Serializer,
11 {
12 let mut map = serializer.serialize_map(None)?;
13
14 map.serialize_entry("name", &self.name)?;
15 map.serialize_entry("symbol", &self.symbol)?;
16 map.serialize_entry("data_url", &self.data_url)?;
17 map.serialize_entry("course", &self.course)?;
18 map.serialize_entry("level_order", &self.level_order)?;
19
20 if let Some(extra_obj) = self.extra.as_object() {
21 for (k, v) in extra_obj {
22 map.serialize_entry(k, v)?;
23 }
24 } else {
25 map.serialize_entry("extra", &self.extra)?;
27 }
28
29 map.end()
30 }
31}
32
33impl serde::Serialize for ChartItem {
34 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
35 where
36 S: serde::Serializer,
37 {
38 let mut map = serializer.serialize_map(None)?;
39
40 map.serialize_entry("level", &self.level)?;
42
43 if let Some(ref md5) = self.md5 {
45 map.serialize_entry("md5", md5)?;
46 }
47 if let Some(ref sha256) = self.sha256 {
48 map.serialize_entry("sha256", sha256)?;
49 }
50 if let Some(ref title) = self.title {
51 map.serialize_entry("title", title)?;
52 }
53 if let Some(ref subtitle) = self.subtitle {
54 map.serialize_entry("subtitle", subtitle)?;
55 }
56 if let Some(ref artist) = self.artist {
57 map.serialize_entry("artist", artist)?;
58 }
59 if let Some(ref subartist) = self.subartist {
60 map.serialize_entry("subartist", subartist)?;
61 }
62 if let Some(ref url) = self.url {
63 map.serialize_entry("url", url)?;
64 }
65 if let Some(ref url_diff) = self.url_diff {
66 map.serialize_entry("url_diff", url_diff)?;
67 }
68
69 if let Some(extra_obj) = self.extra.as_object() {
71 for (k, v) in extra_obj {
72 map.serialize_entry(k, v)?;
73 }
74 } else {
75 map.serialize_entry("extra", &self.extra)?;
77 }
78
79 map.end()
80 }
81}
82
83impl serde::Serialize for BmsTableData {
84 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
85 where
86 S: serde::Serializer,
87 {
88 let mut seq = serializer.serialize_seq(Some(self.charts.len()))?;
90 for chart in &self.charts {
91 seq.serialize_element(chart)?;
92 }
93 seq.end()
94 }
95}