@@ -9,53 +9,114 @@ use std::env;
9
9
use std:: fs;
10
10
use std:: path:: { Path } ;
11
11
use std:: io:: Write ;
12
+ use std:: io;
12
13
13
14
/// main() helps to generate the submission template .rs
14
15
fn main ( ) {
15
- let args: Vec < String > = env:: args ( ) . collect ( ) ;
16
- if args. len ( ) < 2 {
17
- panic ! ( "problem id must be provided" ) ;
18
- }
19
- let id = & args[ 1 ] ;
20
- let id = id. parse :: < u32 > ( ) . expect ( & format ! ( "not a number: {}" , id) ) ;
16
+ println ! ( "Welcome to leetcode-rust system." ) ;
17
+ let mut solved_ids = get_solved_ids ( ) ;
18
+ loop {
19
+ println ! ( "Please enter a problem id, or enter \" random\" to generate a random problem." ) ;
20
+ let mut is_random = false ;
21
+ let mut id : u32 = 0 ;
22
+ let mut id_arg = String :: new ( ) ;
23
+ io:: stdin ( ) . read_line ( & mut id_arg)
24
+ . expect ( "Failed to read line" ) ;
25
+ let id_arg = id_arg. trim ( ) ;
26
+ match id_arg {
27
+ "random" => {
28
+ println ! ( "You select random mode." ) ;
29
+ id = generate_random_id ( & solved_ids) ;
30
+ is_random = true ;
31
+ println ! ( "Generate random problem: {}" , & id) ;
32
+ } ,
33
+ _ => {
34
+ id = id_arg. parse :: < u32 > ( ) . expect ( & format ! ( "not a number: {}" , id_arg) ) ;
35
+ if solved_ids. contains ( & id) {
36
+ println ! ( "The problem you chose is invalid (the problem may have been solved \
37
+ or may have no rust version).") ;
38
+ continue ;
39
+ }
40
+ }
41
+ }
21
42
22
- let problem = problem:: get_problem ( id)
23
- . expect ( & format ! ( "problem #{} not found" , id) ) ;
24
- let code = problem. code_definition . iter ( )
25
- . filter ( |& d| { d. value == "rust" } )
26
- . next ( )
27
- . expect ( "problem has no rust support yet" ) ;
43
+ let problem = problem:: get_problem ( id)
44
+ . expect ( & format ! ( "Error: failed to get problem #{} \
45
+ (The problem may be paid-only or may not be exist).",
46
+ id) ) ;
47
+ let code = problem. code_definition . iter ( )
48
+ . filter ( |& d| { d. value == "rust" } )
49
+ . next ( ) ;
50
+ if code. is_none ( ) {
51
+ println ! ( "Problem {} has no rust version." , & id) ;
52
+ solved_ids. push ( id) ;
53
+ continue ;
54
+ }
55
+ let code = code. unwrap ( ) ;
28
56
29
- let file_name = format ! ( "n{:04}_{}" , id, problem. title_slug. replace( "-" , "_" ) ) ;
30
- let file_path = Path :: new ( "./src" ) . join ( format ! ( "{}.rs" , file_name) ) ;
31
- if file_path. exists ( ) {
32
- panic ! ( "problem already initialized" ) ;
33
- }
57
+ let file_name = format ! ( "n{:04}_{}" , id, problem. title_slug. replace( "-" , "_" ) ) ;
58
+ let file_path = Path :: new ( "./src" ) . join ( format ! ( "{}.rs" , file_name) ) ;
59
+ if file_path. exists ( ) {
60
+ panic ! ( "problem already initialized" ) ;
61
+ }
62
+
63
+ let template = fs:: read_to_string ( "./template.rs" ) . unwrap ( ) ;
64
+ let source = template
65
+ . replace ( "__PROBLEM_TITLE__" , & problem. title )
66
+ . replace ( "__PROBLEM_DESC__" , & build_desc ( & problem. content ) )
67
+ . replace ( "__PROBLEM_DEFAULT_CODE__" , & code. default_code )
68
+ . replace ( "__PROBLEM_ID__" , & format ! ( "{}" , id) )
69
+ . replace ( "__EXTRA_USE__" , & parse_extra_use ( & code. default_code ) ) ;
70
+
71
+ let mut file = fs:: OpenOptions :: new ( )
72
+ . write ( true )
73
+ . create ( true )
74
+ . truncate ( true )
75
+ . open ( & file_path)
76
+ . unwrap ( ) ;
77
+
78
+ file. write_all ( source. as_bytes ( ) ) . unwrap ( ) ;
79
+ drop ( file) ;
34
80
35
- let template = fs:: read_to_string ( "./template.rs" ) . unwrap ( ) ;
36
- let source = template
37
- . replace ( "__PROBLEM_TITLE__" , & problem. title )
38
- . replace ( "__PROBLEM_DESC__" , & build_desc ( & problem. content ) )
39
- . replace ( "__PROBLEM_DEFAULT_CODE__" , & code. default_code )
40
- . replace ( "__PROBLEM_ID__" , & format ! ( "{}" , id) )
41
- . replace ( "__EXTRA_USE__" , & parse_extra_use ( & code. default_code ) ) ;
81
+ let mut lib_file = fs:: OpenOptions :: new ( )
82
+ . write ( true )
83
+ . append ( true )
84
+ . open ( "./src/lib.rs" )
85
+ . unwrap ( ) ;
86
+ writeln ! ( lib_file, "mod {};" , file_name) ;
87
+ break ;
88
+ }
89
+ }
42
90
43
- let mut file = fs:: OpenOptions :: new ( )
44
- . write ( true )
45
- . create ( true )
46
- . truncate ( true )
47
- . open ( & file_path)
48
- . unwrap ( ) ;
91
+ fn generate_random_id ( except_ids : & Vec < u32 > ) -> u32 {
92
+ use std:: fs;
93
+ use rand:: Rng ;
94
+ let mut rng = rand:: thread_rng ( ) ;
95
+ loop {
96
+ let res : u32 = rng. gen_range ( 1 , 1106 ) ;
97
+ if !except_ids. contains ( & res) {
98
+ return res;
99
+ }
100
+ println ! ( "Generate a random num ({}), but it is invalid (the problem may have been solved \
101
+ or may have no rust version). Regenerate..", res) ;
102
+ }
103
+ }
49
104
50
- file. write_all ( source. as_bytes ( ) ) . unwrap ( ) ;
51
- drop ( file) ;
105
+ fn get_solved_ids ( ) -> Vec < u32 > {
106
+ let paths = fs:: read_dir ( "./src" ) . unwrap ( ) ;
107
+ let mut solved_ids = Vec :: new ( ) ;
52
108
53
- let mut lib_file = fs:: OpenOptions :: new ( )
54
- . write ( true )
55
- . append ( true )
56
- . open ( "./src/lib.rs" )
57
- . unwrap ( ) ;
58
- writeln ! ( lib_file, "mod {};" , file_name) ;
109
+ for path in paths {
110
+ let path = path. unwrap ( ) . path ( ) ;
111
+ let s = path. to_str ( ) . unwrap ( ) ;
112
+ if s. chars ( ) . next ( ) . unwrap ( ) != 'n' {
113
+ continue ;
114
+ }
115
+ let id = & s[ 7 ..11 ] ;
116
+ let id = id. parse :: < u32 > ( ) . unwrap ( ) ;
117
+ solved_ids. push ( id) ;
118
+ }
119
+ solved_ids
59
120
}
60
121
61
122
fn parse_extra_use ( code : & str ) -> String {
0 commit comments