use std::time::Duration;
use serde::{Deserialize, Serialize};
pub use lang::Lang;
use ureq::Agent;
mod lang;
#[derive(Serialize, Debug)]
struct Req {
text: String,
source_lang: Lang,
target_lang: Lang,
}
impl Req {
pub fn new(text: String, source_lang: Lang, target_lang: Lang) -> Self {
Req {
text,
source_lang,
target_lang,
}
}
}
#[derive(Deserialize, Debug)]
struct Resp {
code: i32,
data: String,
}
pub fn translate(
api: &str,
text: String,
target_lang: Lang,
source_lang: Lang,
) -> Result<String, Box<dyn std::error::Error>> {
let target_lang = if target_lang == Lang::Auto {
Lang::ZH
} else {
target_lang
};
let req = Req::new(text, source_lang, target_lang);
let agent: Agent = ureq::AgentBuilder::new()
.timeout_read(Duration::from_secs(10))
.timeout_write(Duration::from_secs(10))
.build();
let resp: Resp = agent.post(api).send_json(&req)?.into_json()?;
if resp.code == 200 {
return Ok(resp.data);
}
Ok("翻译接口失效,请更换接口或者自己搭建 https://github.com/zu1k/deepl-api-rs".into())
}