@@ -9,67 +9,98 @@ 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_arg = & args[ 1 ] ;
20- let mut id : u32 = 0 ;
21- match id_arg. as_ref ( ) {
22- "random" => {
23- println ! ( "You select random mode." ) ;
24- id = get_random_id ( ) ;
25- println ! ( "Generate random problem: {}" , & id) ;
26- } ,
27- _ => {
28- id = id_arg. 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+ }
2941 }
30- }
3142
32- let problem = problem:: get_problem ( id)
33- . expect ( & format ! ( "problem #{} not found" , id) ) ;
34- let code = problem. code_definition . iter ( )
35- . filter ( |& d| { d. value == "rust" } )
36- . next ( )
37- . expect ( "problem has no rust support yet" ) ;
43+ let problem = problem:: get_problem ( id)
44+ . expect ( & format ! ( "problem #{} not found" , id) ) ;
45+ let code = problem. code_definition . iter ( )
46+ . filter ( |& d| { d. value == "rust" } )
47+ . next ( ) ;
48+ if code. is_none ( ) {
49+ println ! ( "Problem {} has no rust version." , & id) ;
50+ solved_ids. push ( id) ;
51+ continue ;
52+ }
53+ let code = code. unwrap ( ) ;
3854
39- let file_name = format ! ( "n{:04}_{}" , id, problem. title_slug. replace( "-" , "_" ) ) ;
40- let file_path = Path :: new ( "./src" ) . join ( format ! ( "{}.rs" , file_name) ) ;
41- if file_path. exists ( ) {
42- panic ! ( "problem already initialized" ) ;
43- }
55+ let file_name = format ! ( "n{:04}_{}" , id, problem. title_slug. replace( "-" , "_" ) ) ;
56+ let file_path = Path :: new ( "./src" ) . join ( format ! ( "{}.rs" , file_name) ) ;
57+ if file_path. exists ( ) {
58+ panic ! ( "problem already initialized" ) ;
59+ }
4460
45- let template = fs:: read_to_string ( "./template.rs" ) . unwrap ( ) ;
46- let source = template
47- . replace ( "__PROBLEM_TITLE__" , & problem. title )
48- . replace ( "__PROBLEM_DESC__" , & build_desc ( & problem. content ) )
49- . replace ( "__PROBLEM_DEFAULT_CODE__" , & code. default_code )
50- . replace ( "__PROBLEM_ID__" , & format ! ( "{}" , id) )
51- . replace ( "__EXTRA_USE__" , & parse_extra_use ( & code. default_code ) ) ;
61+ let template = fs:: read_to_string ( "./template.rs" ) . unwrap ( ) ;
62+ let source = template
63+ . replace ( "__PROBLEM_TITLE__" , & problem. title )
64+ . replace ( "__PROBLEM_DESC__" , & build_desc ( & problem. content ) )
65+ . replace ( "__PROBLEM_DEFAULT_CODE__" , & code. default_code )
66+ . replace ( "__PROBLEM_ID__" , & format ! ( "{}" , id) )
67+ . replace ( "__EXTRA_USE__" , & parse_extra_use ( & code. default_code ) ) ;
5268
53- let mut file = fs:: OpenOptions :: new ( )
54- . write ( true )
55- . create ( true )
56- . truncate ( true )
57- . open ( & file_path)
58- . unwrap ( ) ;
69+ let mut file = fs:: OpenOptions :: new ( )
70+ . write ( true )
71+ . create ( true )
72+ . truncate ( true )
73+ . open ( & file_path)
74+ . unwrap ( ) ;
5975
60- file. write_all ( source. as_bytes ( ) ) . unwrap ( ) ;
61- drop ( file) ;
76+ file. write_all ( source. as_bytes ( ) ) . unwrap ( ) ;
77+ drop ( file) ;
6278
63- let mut lib_file = fs:: OpenOptions :: new ( )
64- . write ( true )
65- . append ( true )
66- . open ( "./src/lib.rs" )
67- . unwrap ( ) ;
68- writeln ! ( lib_file, "mod {};" , file_name) ;
79+ let mut lib_file = fs:: OpenOptions :: new ( )
80+ . write ( true )
81+ . append ( true )
82+ . open ( "./src/lib.rs" )
83+ . unwrap ( ) ;
84+ writeln ! ( lib_file, "mod {};" , file_name) ;
85+ break ;
86+ }
6987}
7088
71- fn get_random_id ( ) -> u32 {
89+ fn generate_random_id ( except_ids : & Vec < u32 > ) -> u32 {
7290 use std:: fs;
91+ use rand:: Rng ;
92+ let mut rng = rand:: thread_rng ( ) ;
93+ loop {
94+ let res : u32 = rng. gen_range ( 1 , 1106 ) ;
95+ if !except_ids. contains ( & res) {
96+ return res;
97+ }
98+ println ! ( "Generate a random num ({}), but it is invalid (the problem may have been solved \
99+ or may have no rust version). Regenerate..", res) ;
100+ }
101+ }
102+
103+ fn get_solved_ids ( ) -> Vec < u32 > {
73104 let paths = fs:: read_dir ( "./src" ) . unwrap ( ) ;
74105 let mut solved_ids = Vec :: new ( ) ;
75106
@@ -83,15 +114,7 @@ fn get_random_id() -> u32 {
83114 let id = id. parse :: < u32 > ( ) . unwrap ( ) ;
84115 solved_ids. push ( id) ;
85116 }
86- use rand:: Rng ;
87- let mut rng = rand:: thread_rng ( ) ;
88- loop {
89- let res : u32 = rng. gen_range ( 1 , 1106 ) ;
90- if !solved_ids. contains ( & res) {
91- return res;
92- }
93- println ! ( "Generate a random num ({}), but it is solved. Regenerate.." , res) ;
94- }
117+ solved_ids
95118}
96119
97120fn parse_extra_use ( code : & str ) -> String {
0 commit comments