bms_table/
ser.rs

1//! 序列化模块。
2
3use crate::{BmsTableData, BmsTableHeader, ChartItem};
4use serde::ser::{SerializeMap, SerializeSeq};
5
6impl serde::Serialize for BmsTableHeader {
7    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
8    where
9        S: serde::Serializer,
10    {
11        let mut map = serializer.serialize_map(None)?;
12
13        map.serialize_entry("name", &self.name)?;
14        map.serialize_entry("symbol", &self.symbol)?;
15        map.serialize_entry("data_url", &self.data_url)?;
16        map.serialize_entry("course", &self.course)?;
17        map.serialize_entry("level_order", &self.level_order)?;
18
19        if let Some(extra_obj) = self.extra.as_object() {
20            for (k, v) in extra_obj {
21                map.serialize_entry(k, v)?;
22            }
23        } else {
24            // 回退:如果不是对象,按原样放在 `extra` 字段下
25            map.serialize_entry("extra", &self.extra)?;
26        }
27
28        map.end()
29    }
30}
31
32impl serde::Serialize for ChartItem {
33    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
34    where
35        S: serde::Serializer,
36    {
37        let mut map = serializer.serialize_map(None)?;
38
39        // 必填字段
40        map.serialize_entry("level", &self.level)?;
41
42        // 可选字段:仅在存在时输出
43        if let Some(ref md5) = self.md5 {
44            map.serialize_entry("md5", md5)?;
45        }
46        if let Some(ref sha256) = self.sha256 {
47            map.serialize_entry("sha256", sha256)?;
48        }
49        if let Some(ref title) = self.title {
50            map.serialize_entry("title", title)?;
51        }
52        if let Some(ref subtitle) = self.subtitle {
53            map.serialize_entry("subtitle", subtitle)?;
54        }
55        if let Some(ref artist) = self.artist {
56            map.serialize_entry("artist", artist)?;
57        }
58        if let Some(ref subartist) = self.subartist {
59            map.serialize_entry("subartist", subartist)?;
60        }
61        if let Some(ref url) = self.url {
62            map.serialize_entry("url", url)?;
63        }
64        if let Some(ref url_diff) = self.url_diff {
65            map.serialize_entry("url_diff", url_diff)?;
66        }
67
68        // 展平额外字段到顶层
69        if let Some(extra_obj) = self.extra.as_object() {
70            for (k, v) in extra_obj {
71                map.serialize_entry(k, v)?;
72            }
73        } else {
74            // 回退:如果不是对象,按原样放在 `extra` 字段下
75            map.serialize_entry("extra", &self.extra)?;
76        }
77
78        map.end()
79    }
80}
81
82impl serde::Serialize for BmsTableData {
83    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
84    where
85        S: serde::Serializer,
86    {
87        // 直接输出数组,而不是 `{ charts: [...] }`
88        let mut seq = serializer.serialize_seq(Some(self.charts.len()))?;
89        for chart in &self.charts {
90            seq.serialize_element(chart)?;
91        }
92        seq.end()
93    }
94}