1
- use std:: io:: Write ;
2
-
3
1
use anyhow:: { Context , Result } ;
4
2
use clap:: Parser ;
5
- use redb:: { Database , TableDefinition } ;
6
- use serde_derive:: Deserialize ;
7
- use termcolor:: { Buffer , ColorSpec , WriteColor } ;
8
-
9
- const REQUEST_BASE : & ' static str = "http://fanyi.youdao.com/openapi.do?keyfrom=ydcv-rust&key=379421805&type=data&doctype=json&version=1.1&q=" ;
10
-
11
- #[ derive( Debug , Deserialize ) ]
12
- #[ serde( untagged) ]
13
- enum Phonetic {
14
- En2Zh {
15
- #[ serde( rename = "us-phonetic" ) ]
16
- us : String ,
17
- #[ serde( rename = "uk-phonetic" ) ]
18
- uk : String ,
19
- } ,
20
- Zh2En {
21
- phonetic : String ,
22
- } ,
23
- }
24
-
25
- #[ derive( Debug , Deserialize ) ]
26
- struct Basic {
27
- // 有些查询没有这个字段,比如 `cli`
28
- #[ serde( flatten) ]
29
- phonetic : Option < Phonetic > ,
30
- explains : Vec < String > ,
31
- }
32
-
33
- #[ derive( Debug , Deserialize ) ]
34
- struct Kv {
35
- key : String ,
36
- value : Vec < String > ,
37
- }
38
-
39
- #[ derive( Debug , Deserialize ) ]
40
- struct YdcvResp {
41
- query : String ,
42
- translation : Vec < String > ,
43
- basic : Basic ,
44
- web : Option < Vec < Kv > > ,
45
- }
46
-
47
- impl YdcvResp {
48
- fn colorized ( & self ) -> Result < String > {
49
- let mut f = Buffer :: ansi ( ) ;
50
-
51
- f. set_color ( ColorSpec :: new ( ) . set_underline ( true ) ) ?;
52
-
53
- write ! ( f, "{}" , self . query) ?;
54
-
55
- f. reset ( ) . unwrap ( ) ;
56
-
57
- match & self . basic . phonetic {
58
- Some ( Phonetic :: En2Zh { us, uk } ) => {
59
- for ( k, v) in [ ( "us" , us) , ( "uk" , uk) ] {
60
- write ! ( f, " {k}: [" ) ?;
61
- f. set_color ( ColorSpec :: new ( ) . set_fg ( Some ( termcolor:: Color :: Yellow ) ) ) ?;
62
- write ! ( f, "{v}" ) ?;
63
- f. reset ( ) ?;
64
- write ! ( f, "]" ) ?;
65
- }
66
- }
67
- Some ( Phonetic :: Zh2En { phonetic } ) => {
68
- write ! ( f, " [" ) ?;
69
- f. set_color ( ColorSpec :: new ( ) . set_fg ( Some ( termcolor:: Color :: Yellow ) ) ) ?;
70
- write ! ( f, " {phonetic} " ) ?;
71
- f. reset ( ) ?;
72
- write ! ( f, "]" ) ?;
73
- }
74
- None => { }
75
- }
76
-
77
- for i in & self . translation {
78
- write ! ( f, " {}" , i) ?;
79
- }
3
+ use explain:: YdcvResp ;
80
4
81
- f. set_color ( ColorSpec :: new ( ) . set_fg ( Some ( termcolor:: Color :: Cyan ) ) ) ?;
82
- write ! ( f, "\n World Explanation:\n " ) ?;
83
- f. reset ( ) ?;
5
+ mod db;
6
+ mod explain;
84
7
85
- for i in & self . basic . explains {
86
- write ! ( f, " * {}\n " , i) ?;
87
- }
88
-
89
- if let Some ( web) = & self . web {
90
- f. set_color ( ColorSpec :: new ( ) . set_fg ( Some ( termcolor:: Color :: Cyan ) ) ) ?;
91
- write ! ( f, "\n Web Reference:" ) ?;
92
- f. reset ( ) ?;
93
-
94
- for Kv { key, value } in web {
95
- write ! ( f, "\n * " ) ?;
96
-
97
- f. set_color ( ColorSpec :: new ( ) . set_fg ( Some ( termcolor:: Color :: Yellow ) ) ) ?;
98
- write ! ( f, "{key}\n " ) ?;
99
- f. reset ( ) ?;
100
-
101
- let v = value. join ( "," ) ;
102
- f. set_color ( ColorSpec :: new ( ) . set_fg ( Some ( termcolor:: Color :: Magenta ) ) ) ?;
103
- write ! ( f, " {v}" ) ?;
104
- f. reset ( ) ?;
105
- }
106
- }
107
-
108
- String :: from_utf8 ( f. into_inner ( ) ) . map_err ( From :: from)
109
- }
110
- }
8
+ const REQUEST_BASE : & ' static str = "http://fanyi.youdao.com/openapi.do?keyfrom=ydcv-rust&key=379421805&type=data&doctype=json&version=1.1&q=" ;
111
9
112
10
#[ derive( Parser , Debug ) ]
113
11
struct Args {
114
12
word : String ,
115
13
}
116
14
117
- fn save_dict_info ( query : & str , result : & str ) -> Result < ( ) > {
118
- const TABLE : TableDefinition < str , str > = TableDefinition :: new ( "ydcv" ) ;
119
-
120
- let Some ( mut dir) = dirs:: home_dir ( ) else {
121
- return Ok ( ( ) ) ;
122
- } ;
123
-
124
- dir. push ( "proliferation/english" ) ;
125
-
126
- if !dir. exists ( ) {
127
- std:: fs:: create_dir_all ( & dir) ?;
128
- }
129
-
130
- dir. push ( "ydcv.redb" ) ;
131
-
132
- let db = unsafe { Database :: create ( dir, 1024 * 1024 ) ? } ;
133
-
134
- let write_txn = db. begin_write ( ) ?;
135
- {
136
- let mut table = write_txn. open_table ( TABLE ) ?;
137
- table. insert ( query, result) ?;
138
- }
139
- write_txn. commit ( ) ?;
140
-
141
- Ok ( ( ) )
142
- }
143
-
144
15
#[ tokio:: main]
145
16
async fn main ( ) -> Result < ( ) > {
146
17
let args = Args :: parse ( ) ;
@@ -156,9 +27,9 @@ async fn main() -> Result<()> {
156
27
) ) ?;
157
28
158
29
let res = resp. colorized ( ) ?;
159
- println ! ( "{}" , res) ;
30
+ // println!("{}", res);
160
31
161
- save_dict_info ( & args. word , & res) ?;
32
+ db :: save_query_explain ( & args. word , res) ?;
162
33
163
34
Ok ( ( ) )
164
35
}
0 commit comments