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