use super::{Error, Result};
use crate::DeepLApi;
use serde::Deserialize;
#[derive(Deserialize)]
pub struct LangInfo {
pub language: String,
pub name: String,
pub supports_formality: Option<bool>,
}
#[derive(Debug)]
pub enum LangType {
Source,
Target,
}
impl AsRef<str> for LangType {
fn as_ref(&self) -> &str {
match self {
Self::Source => "source",
Self::Target => "target",
}
}
}
impl DeepLApi {
pub async fn languages(&self, lang_type: LangType) -> Result<Vec<LangInfo>> {
let q = vec![("type", lang_type.as_ref())];
let resp = self
.get(self.get_endpoint("languages"))
.query(&q)
.send()
.await
.map_err(|err| Error::RequestFail(err.to_string()))?;
if !resp.status().is_success() {
return super::extract_deepl_error(resp).await;
}
resp.json().await.map_err(|err| {
Error::InvalidResponse(format!("convert json bytes to Rust type: {err}"))
})
}
}
#[tokio::test]
async fn test_get_languages() {
let deepl = DeepLApi::with(&std::env::var("DEEPL_API_KEY").unwrap()).new();
let langs = deepl.languages(LangType::Target).await.unwrap();
assert!(!langs.is_empty());
}
#[tokio::test]
async fn test_generate_langs() {
use crate::Lang;
let deepl = DeepLApi::with(&std::env::var("DEEPL_API_KEY").unwrap()).new();
let source_langs = deepl.languages(LangType::Source).await.unwrap();
let codes: Vec<&str> = source_langs.iter().map(|l| l.language.as_str()).collect();
let mut target_langs = deepl.languages(LangType::Target).await.unwrap();
target_langs.retain(|l| !codes.contains(&l.language.as_str()));
let _: Vec<Lang> = source_langs
.into_iter()
.chain(target_langs)
.map(|l| {
let code = &l.language;
let name = &l.name;
Lang::try_from(code)
.map_err(|_| println!("Failed to convert lang: {code} {name}"))
.unwrap()
})
.collect();
}