oca_bundle/state/
entry_codes.rs1use indexmap::IndexMap;
2use serde::{ser::{SerializeSeq, SerializeMap}, Deserialize, Serialize};
3
4impl Serialize for EntryCodes {
5 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
6 where
7 S: serde::Serializer,
8 {
9 match self {
10 Self::Sai(sai) => serializer.serialize_str(sai),
11 Self::Array(codes) => {
12 let mut seq = serializer.serialize_seq(Some(codes.len()))?;
13 let mut sorted_codes = codes.clone();
14 sorted_codes.sort();
15 for code in sorted_codes {
16 seq.serialize_element(&code)?;
17 }
18 seq.end()
19 }
20 Self::Object(codes) => {
21 let mut map = serializer.serialize_map(Some(codes.len()))?;
22 let sorted_codes: IndexMap<_, _> = codes.iter().collect();
23 for (k, v) in sorted_codes {
24 map.serialize_entry(k, v)?;
25 }
26 map.end()
27 }
28 }
29 }
30}
31
32#[derive(Deserialize, Debug, Clone)]
33#[serde(untagged)]
34pub enum EntryCodes {
35 Sai(String),
36 Array(Vec<String>),
37 Object(IndexMap<String, Vec<String>>),
38}