@@ -9,53 +9,114 @@ use std::env;
99use std:: fs;
1010use std:: path:: { Path } ;
1111use std:: io:: Write ;
12+ use std:: io;
1213
1314/// main() helps to generate the submission template .rs
1415fn 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+ }
2142
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 ( ) ;
2856
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) ;
3480
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+ }
4290
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+ }
49104
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 ( ) ;
52108
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
59120}
60121
61122fn parse_extra_use ( code : & str ) -> String {
0 commit comments