cloudiful_bevy_localization/
text_key.rs1use 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}