retrom_codegen/
storage_type.rs

1use serde::{
2    de::{self, Visitor},
3    Deserializer,
4};
5
6struct StringifiedStorageTypeVisitor;
7
8impl Visitor<'_> for StringifiedStorageTypeVisitor {
9    type Value = Option<i32>;
10
11    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
12        formatter.write_str("an integer or name representing a StorageType")
13    }
14
15    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
16    where
17        E: de::Error,
18    {
19        match v {
20            "MultiFileGame" => Ok(Some(crate::retrom::StorageType::MultiFileGame as i32)),
21            "SingleFileGame" => Ok(Some(crate::retrom::StorageType::SingleFileGame as i32)),
22            _ => Err(de::Error::unknown_variant(
23                v,
24                &["MultiFileGame", "SingleFileGame"],
25            )),
26        }
27    }
28
29    fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
30    where
31        E: de::Error,
32    {
33        Ok(Some(v as i32))
34    }
35}
36
37pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<i32>, D::Error>
38where
39    D: Deserializer<'de>,
40{
41    deserializer.deserialize_any(StringifiedStorageTypeVisitor)
42}
43
44pub fn serialize<S>(value: &Option<i32>, serializer: S) -> Result<S::Ok, S::Error>
45where
46    S: serde::Serializer,
47{
48    use crate::retrom::StorageType;
49
50    let value: Option<StorageType> = value.map(|v| StorageType::try_from(v).unwrap_or_default());
51
52    match value {
53        Some(storage_type) => match storage_type {
54            StorageType::MultiFileGame => serializer.serialize_i32(0),
55            StorageType::SingleFileGame => serializer.serialize_i32(1),
56            StorageType::Custom => serializer.serialize_i32(2),
57        },
58        None => serializer.serialize_none(),
59    }
60}