···11+use langtag::InvalidLangTag;
12use serde::{Deserialize, Deserializer, Serialize, de::Error};
23use smol_str::{SmolStr, ToSmolStr};
34use std::fmt;
···3637 Ok(Language(SmolStr::new_static(tag.as_str())))
3738 }
38394040+ fn new_owned(lang: SmolStr) -> Result<Self, SmolStr> {
4141+ let tag = langtag::LangTag::new(&lang).map_err(|e| e.to_smolstr())?;
4242+ Ok(Language(SmolStr::new(tag.as_str())))
4343+ }
4444+3945 /// Infallible constructor for when you *know* the string is a valid IETF language tag.
4046 /// Will panic on invalid tag. If you're manually decoding atproto records
4147 /// or API values you know are valid (rather than using serde), this is the one to use.
···7581 where
7682 D: Deserializer<'de>,
7783 {
7878- let value: &str = Deserialize::deserialize(deserializer)?;
7979- Self::new(value).map_err(D::Error::custom)
8484+ let value = Deserialize::deserialize(deserializer)?;
8585+ Self::new_owned(value).map_err(D::Error::custom)
8086 }
8187}
8288