bms_table/
ser.rs

1//! 序列化模块。
2#![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            // 回退:如果不是对象,按原样放在 `extra` 字段下
26            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        // 必填字段
41        map.serialize_entry("level", &self.level)?;
42
43        // 可选字段:仅在存在时输出
44        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        // 展平额外字段到顶层
70        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            // 回退:如果不是对象,按原样放在 `extra` 字段下
76            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        // 直接输出数组,而不是 `{ charts: [...] }`
89        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}