use crate::resource::authored_resource::AuthoredResource;
impl AuthoredResource {
#[must_use]
pub fn languages_available(&self) -> Vec<&str> {
let mut out = vec![self.original_language.code_string.as_str()];
if let Some(translations) = &self.translations {
out.extend(translations.keys().map(String::as_str));
}
out
}
}
#[cfg(test)]
mod tests {
use crate::foundation_types::terminology::terminology_code::TerminologyCode;
use crate::resource::authored_resource::AuthoredResource;
use crate::resource::translation_details::TranslationDetails;
fn resource(translations: &[&str]) -> AuthoredResource {
AuthoredResource {
uid: None,
original_language: TerminologyCode {
terminology_id: "ISO_639-1".to_owned(),
terminology_version: None,
code_string: "en".to_owned(),
uri: None,
},
description: None,
is_controlled: None,
annotations: None,
translations: if translations.is_empty() {
None
} else {
Some(
translations
.iter()
.map(|lang| {
(
(*lang).to_owned(),
TranslationDetails {
language: TerminologyCode {
terminology_id: "ISO_639-1".to_owned(),
terminology_version: None,
code_string: (*lang).to_owned(),
uri: None,
},
author: std::collections::BTreeMap::new(),
accreditation: None,
other_details: None,
version_last_translated: None,
other_contributors: None,
},
)
})
.collect(),
)
},
}
}
#[test]
fn original_language_only() {
assert_eq!(resource(&[]).languages_available(), ["en"]);
}
#[test]
fn original_plus_translations() {
assert_eq!(
resource(&["de", "pt"]).languages_available(),
["en", "de", "pt"]
);
}
}