ssi_vc/v2/data_model/
language.rs

1use ssi_json_ld::{syntax::LangTag, Direction, LangString, LenientLangTag};
2
3pub struct LanguageValueRef<'a> {
4    pub value: &'a str,
5    pub language: Option<&'a LangTag>,
6    pub direction: Option<Direction>,
7}
8
9impl<'a> From<&'a LangString> for LanguageValueRef<'a> {
10    fn from(value: &'a LangString) -> Self {
11        LanguageValueRef {
12            value: value.as_str(),
13            language: value.language().and_then(LenientLangTag::as_well_formed),
14            direction: value.direction(),
15        }
16    }
17}
18
19pub trait AnyInternationalString {
20    fn default_value(&self) -> Option<LanguageValueRef>;
21
22    fn get_language(&self, _lang: &LangTag) -> Option<LanguageValueRef> {
23        None
24    }
25
26    fn get_language_or_default(&self, lang: &LangTag) -> Option<LanguageValueRef> {
27        self.get_language(lang).or_else(|| self.default_value())
28    }
29}
30
31impl<T: ?Sized + AnyInternationalString> AnyInternationalString for &T {
32    fn default_value(&self) -> Option<LanguageValueRef> {
33        T::default_value(*self)
34    }
35}
36
37impl AnyInternationalString for str {
38    fn default_value(&self) -> Option<LanguageValueRef> {
39        Some(LanguageValueRef {
40            value: self,
41            language: None,
42            direction: None,
43        })
44    }
45}
46
47impl AnyInternationalString for String {
48    fn default_value(&self) -> Option<LanguageValueRef> {
49        self.as_str().default_value()
50    }
51}
52
53impl AnyInternationalString for LangString {
54    fn default_value(&self) -> Option<LanguageValueRef> {
55        Some(LanguageValueRef::from(self))
56    }
57}