···5566use crate::CowStr;
7788-/// A [Timestamp Identifier].
88+/// An IETF language tag.
99+///
1010+/// Uses langtag crate for validation, but is stored as a SmolStr for size/avoiding allocations
911///
1010-/// [Timestamp Identifier]: https://atproto.com/specs/lang
1212+/// TODO: Implement langtag-style semantic matching for this type, delegating to langtag
1113#[derive(Clone, Debug, PartialEq, Eq, Serialize, Hash)]
1214#[serde(transparent)]
1315#[repr(transparent)]
1414-pub struct Lang(SmolStr);
1616+pub struct Language(SmolStr);
15171616-impl Lang {
1818+impl Language {
1719 /// Parses an IETF language tag from the given string.
1820 pub fn new<T>(lang: &T) -> Result<Self, langtag::InvalidLangTag<&T>>
1921 where
2022 T: AsRef<str> + ?Sized,
2123 {
2224 let tag = langtag::LangTag::new(lang)?;
2323- Ok(Lang(SmolStr::new_inline(tag.as_str())))
2525+ Ok(Language(SmolStr::new_inline(tag.as_str())))
2426 }
25272628 /// Infallible constructor for when you *know* the string is a valid IETF language tag.
···3032 pub fn raw(lang: impl AsRef<str>) -> Self {
3133 let lang = lang.as_ref();
3234 let tag = langtag::LangTag::new(lang).expect("valid IETF language tag");
3333- Lang(SmolStr::new_inline(tag.as_str()))
3535+ Language(SmolStr::new_inline(tag.as_str()))
3436 }
35373638 /// Infallible constructor for when you *know* the string is a valid IETF language tag.
···4951 }
5052}
51535252-impl FromStr for Lang {
5454+impl FromStr for Language {
5355 type Err = SmolStr;
54565557 fn from_str(s: &str) -> Result<Self, Self::Err> {
···5759 }
5860}
59616060-impl<'de> Deserialize<'de> for Lang {
6262+impl<'de> Deserialize<'de> for Language {
6163 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
6264 where
6365 D: Deserializer<'de>,
···6769 }
6870}
69717070-impl fmt::Display for Lang {
7272+impl fmt::Display for Language {
7173 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
7274 f.write_str(&self.0)
7375 }
7476}
75777676-impl From<Lang> for String {
7777- fn from(value: Lang) -> Self {
7878+impl From<Language> for String {
7979+ fn from(value: Language) -> Self {
7880 value.0.to_string()
7981 }
8082}
81838282-impl From<Lang> for SmolStr {
8383- fn from(value: Lang) -> Self {
8484+impl From<Language> for SmolStr {
8585+ fn from(value: Language) -> Self {
8486 value.0
8587 }
8688}
87898888-impl From<String> for Lang {
9090+impl From<String> for Language {
8991 fn from(value: String) -> Self {
9092 Self::raw(&value)
9193 }
9294}
93959494-impl<'t> From<CowStr<'t>> for Lang {
9696+impl<'t> From<CowStr<'t>> for Language {
9597 fn from(value: CowStr<'t>) -> Self {
9698 Self::raw(&value)
9799 }
98100}
99101100100-impl AsRef<str> for Lang {
102102+impl AsRef<str> for Language {
101103 fn as_ref(&self) -> &str {
102104 self.as_str()
103105 }
104106}
105107106106-impl Deref for Lang {
108108+impl Deref for Language {
107109 type Target = str;
108110109111 fn deref(&self) -> &Self::Target {