use serde::{Deserialize, Serialize};
use std::fmt;
use std::str::FromStr;
use super::{Error, Result};
use crate::DeepL;
#[derive(Copy, Clone, Debug)]
pub enum LanguageType {
Source,
Target,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct LanguageInfo {
pub language: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub supports_formality: Option<bool>,
}
impl Default for LanguageInfo {
fn default() -> Self {
Self {
language: String::default(),
name: String::default(),
supports_formality: None,
}
}
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum Language {
BG,
CS,
DA,
DE,
EL,
EN,
ENGB,
ENUS,
ES,
ET,
FI,
FR,
HU,
ID,
IT,
JA,
KO,
LT,
LV,
NB,
NL,
PL,
PT,
PTBR,
PTPT,
RO,
RU,
SK,
SL,
SV,
TR,
UK,
ZH,
}
impl FromStr for Language {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let lang = match s.to_uppercase().as_str() {
"BG" => Language::BG,
"CS" => Language::CS,
"DA" => Language::DA,
"DE" => Language::DE,
"EL" => Language::EL,
"EN" => Language::EN,
"EN-GB" => Language::ENGB,
"EN-US" => Language::ENUS,
"ES" => Language::ES,
"ET" => Language::ET,
"FI" => Language::FI,
"FR" => Language::FR,
"HU" => Language::HU,
"ID" => Language::ID,
"IT" => Language::IT,
"JA" => Language::JA,
"KO" => Language::KO,
"LT" => Language::LT,
"LV" => Language::LV,
"NB" => Language::NB,
"NL" => Language::NL,
"PL" => Language::PL,
"PT" => Language::PT,
"PT-BR" => Language::PTBR,
"PT-PT" => Language::PTPT,
"RO" => Language::RO,
"RU" => Language::RU,
"SK" => Language::SK,
"SL" => Language::SL,
"SV" => Language::SV,
"TR" => Language::TR,
"UK" => Language::UK,
"ZH" => Language::ZH,
_ => return Err(Error::InvalidLanguage),
};
Ok(lang)
}
}
impl AsRef<str> for Language {
fn as_ref(&self) -> &str {
match self {
Self::BG => "BG",
Self::CS => "CS",
Self::DA => "DA",
Self::DE => "DE",
Self::EL => "EL",
Self::EN => "EN",
Self::ENGB => "EN-GB",
Self::ENUS => "EN-US",
Self::ES => "ES",
Self::ET => "ET",
Self::FI => "FI",
Self::FR => "FR",
Self::HU => "HU",
Self::ID => "ID",
Self::IT => "IT",
Self::JA => "JA",
Self::KO => "KO",
Self::LT => "LT",
Self::LV => "LV",
Self::NB => "NB",
Self::NL => "NL",
Self::PL => "PL",
Self::PT => "PT",
Self::PTBR => "PT-BR",
Self::PTPT => "PT-PT",
Self::RO => "RO",
Self::RU => "RU",
Self::SK => "SK",
Self::SL => "SL",
Self::SV => "SV",
Self::TR => "TR",
Self::UK => "UK",
Self::ZH => "ZH",
}
}
}
impl fmt::Display for Language {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_ref())
}
}
impl DeepL {
pub fn languages(&self, lang_type: LanguageType) -> Result<Vec<LanguageInfo>> {
let url = format!("{}/languages", self.url);
let kind = match lang_type {
LanguageType::Source => "source",
LanguageType::Target => "target",
};
let q = vec![("type", kind)];
let resp = self.get(url).query(&q).send().map_err(Error::Reqwest)?;
if !resp.status().is_success() {
return super::convert(resp);
}
resp.json().map_err(|_| Error::Deserialize)
}
}