1use std::time::Duration;
2
3use serde::{Deserialize, Serialize};
4
5pub use lang::Lang;
6use ureq::Agent;
7mod lang;
8
9#[derive(Serialize, Debug)]
10struct Req {
11 text: String,
12 source_lang: Lang,
13 target_lang: Lang,
14}
15
16impl Req {
17 pub fn new(text: String, source_lang: Lang, target_lang: Lang) -> Self {
18 Req {
19 text,
20 source_lang,
21 target_lang,
22 }
23 }
24}
25
26#[derive(Deserialize, Debug)]
27struct Resp {
28 code: i32,
29 data: String,
30}
31
32pub fn translate(
33 api: &str,
34 text: String,
35 target_lang: Lang,
36 source_lang: Lang,
37) -> Result<String, Box<dyn std::error::Error>> {
38 let target_lang = if target_lang == Lang::Auto {
39 Lang::ZH
40 } else {
41 target_lang
42 };
43 let req = Req::new(text, source_lang, target_lang);
44
45 let agent: Agent = ureq::AgentBuilder::new()
46 .timeout_read(Duration::from_secs(10))
47 .timeout_write(Duration::from_secs(10))
48 .build();
49 let resp: Resp = agent.post(api).send_json(&req)?.into_json()?;
50
51 if resp.code == 200 {
52 return Ok(resp.data);
53 }
54
55 Ok("翻译接口失效,请更换接口或者自己搭建 https://github.com/zu1k/deepl-api-rs".into())
56}