retrom_codegen/
storage_type.rs1use 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}