ssi_vc/v2/data_model/
language.rs1use 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}