Skip to main content

cloudiful_bevy_localization/
text_key.rs

1use crate::definition_registry::active_definition;
2use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error as DeError};
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5pub struct TextKey(&'static str);
6
7impl TextKey {
8    pub const fn new(id: &'static str) -> Self {
9        Self(id)
10    }
11
12    pub const fn id(self) -> &'static str {
13        self.0
14    }
15
16    pub fn from_id(id: &str) -> Option<Self> {
17        active_definition()
18            .keys
19            .iter()
20            .copied()
21            .find(|key| key.id() == id)
22    }
23}
24
25impl Serialize for TextKey {
26    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
27    where
28        S: Serializer,
29    {
30        serializer.serialize_str(self.id())
31    }
32}
33
34impl<'de> Deserialize<'de> for TextKey {
35    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
36    where
37        D: Deserializer<'de>,
38    {
39        let id = String::deserialize(deserializer)?;
40        TextKey::from_id(&id).ok_or_else(|| D::Error::custom(format!("unknown text key: {id}")))
41    }
42}