fy_cli_rust/
parse.rs

1use crate::model::{Params, TransformRes, UserRes};
2use clap::{App, Arg};
3use sha2::{Digest, Sha256};
4use std::time::SystemTime;
5use uuid::Uuid;
6
7fn generate_param_input(q: String) -> String {
8    let len = q.len();
9    if len <= 20 {
10        return q;
11    }
12    format!("{}{}{}", &q[..10], len, &q[(len - 10)..len])
13}
14
15// 获取交互方式
16pub fn get_user_way() -> Result<(UserRes, Vec<String>), ()> {
17    let matches = App::new("fy-cli-rust")
18        .version("0.1")
19        .author("Kreedzt <zhaozisong1@live.com>")
20        .about("使用有道翻译 api 进行翻译")
21        .arg(
22            Arg::new("config")
23                .short('c')
24                .long("config")
25                .max_values(2)
26                .min_values(2)
27                .about("设置密钥, 格式: app_key app_secure")
28                .required(false)
29                .takes_value(true)
30                .conflicts_with("content"),
31        )
32        .arg(
33            Arg::new("content")
34                .about("待翻译的内容")
35                .required_unless_present("config"),
36        )
37        .get_matches();
38
39    // println!("matches: {:?}", matches);
40
41    if let Some(config_kv) = matches.values_of("config") {
42        let v: Vec<String> = config_kv.into_iter().map(|s| s.to_string()).collect();
43        return Ok((UserRes::SETKEY, v));
44    }
45
46    if let Some(input) = matches.value_of("content") {
47        let mut v = Vec::with_capacity(1);
48        v.push(input.to_string());
49        return Ok((UserRes::QUERY, v));
50    }
51
52    Err(())
53}
54
55pub fn get_user_input(s: String) -> String {
56    generate_param_input(s)
57}
58
59pub fn generate_param(user_input: String, app_key: String, app_secure: String) -> Params {
60    let salt = format!("{}", Uuid::new_v4());
61    let curtime = format!(
62        "{}",
63        SystemTime::now()
64            .duration_since(SystemTime::UNIX_EPOCH)
65            .unwrap()
66            .as_secs()
67    );
68
69    let source_sign = format!(
70        "{}{}{}{}{}",
71        app_key,
72        generate_param_input(user_input.clone()),
73        salt,
74        curtime,
75        app_secure
76    );
77    let mut hasher = Sha256::new();
78    hasher.update(source_sign.as_bytes());
79    let sign: String = format!("{:X}", hasher.finalize());
80
81    Params {
82        q: user_input,
83        salt,
84        from: "auto".to_string(),
85        to: "auto".to_string(),
86        app_key,
87        sign,
88        sign_type: "v3".to_string(),
89        curtime,
90        ..Params::default()
91    }
92}
93
94pub fn display_res(res: TransformRes) {
95    if let Some(q) = res.query {
96        println!("{}", q);
97    }
98
99    if let Some(k) = res.basic {
100        println!("基础释义:");
101        let mut s = String::new();
102        for x in k.explains {
103            s.push_str(&x);
104        }
105        println!("{}", s);
106        println!("========");
107    }
108
109    if let Some(w) = res.web {
110        println!("网络释义:");
111        for item in w {
112            println!("{}", item.key);
113            let mut s = String::new();
114            for wi in item.value {
115                s.push_str(&wi);
116            }
117            println!("{}", s);
118            println!("--------");
119        }
120    }
121}