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
15pub 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 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}