use std::fmt::{Display, Formatter};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct MeaningId {
pub wikidata_item: Option<String>,
pub wikidata_sense: Option<String>,
pub wiktionary_page: Option<String>,
}
impl MeaningId {
#[must_use]
#[allow(dead_code)]
pub fn from_item(item: impl Into<String>) -> Self {
Self {
wikidata_item: Some(item.into()),
wikidata_sense: None,
wiktionary_page: None,
}
}
#[must_use]
pub fn from_sense(sense: impl Into<String>) -> Self {
Self {
wikidata_item: None,
wikidata_sense: Some(sense.into()),
wiktionary_page: None,
}
}
#[must_use]
pub fn from_wiktionary_page(lang: &str, title: &str) -> Self {
Self {
wikidata_item: None,
wikidata_sense: None,
wiktionary_page: Some(format!("{lang}:{title}")),
}
}
#[must_use]
pub fn slug(&self) -> String {
if let Some(item) = self.wikidata_item.as_deref() {
return format!("wikidata:{item}");
}
if let Some(sense) = self.wikidata_sense.as_deref() {
return format!("wikidata-sense:{sense}");
}
if let Some(page) = self.wiktionary_page.as_deref() {
return format!("wiktionary:{page}");
}
String::from("meaning:unknown")
}
#[must_use]
#[allow(dead_code)]
pub const fn is_wikidata_backed(&self) -> bool {
self.wikidata_item.is_some() || self.wikidata_sense.is_some()
}
}
impl Display for MeaningId {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter.write_str(&self.slug())
}
}