@@ -6,18 +6,14 @@ use serde::Deserialize;
66struct ExerciseInfo < ' a > {
77 name : & ' a str ,
88 dir : & ' a str ,
9- }
10-
11- #[ derive( Deserialize ) ]
12- struct InputFileInfo < ' a > {
13- name : & ' a str ,
9+ #[ serde( default ) ]
10+ input_files : Vec < & ' a str > ,
1411}
1512
1613#[ derive( Deserialize ) ]
1714struct InfoFile < ' a > {
1815 #[ serde( borrow) ]
1916 exercises : Vec < ExerciseInfo < ' a > > ,
20- input_files : Vec < InputFileInfo < ' a > > ,
2117}
2218
2319#[ proc_macro]
@@ -47,22 +43,34 @@ pub fn include_files(_: TokenStream) -> TokenStream {
4743 * dir_ind = dirs. len ( ) - 1 ;
4844 }
4945
46+ let input_files = exercises. iter ( ) . map ( |exercise| {
47+ let names = exercise. input_files . iter ( ) ;
48+ let paths = exercise
49+ . input_files
50+ . iter ( )
51+ . map ( |f| format ! ( "../exercises/{}/{}" , exercise. dir, f) ) ;
52+ quote ! {
53+ & [ #( InputFile {
54+ name: #names,
55+ content: include_str!( #paths) ,
56+ } ) , * ]
57+ }
58+ } ) ;
59+
5060 let readmes = dirs
5161 . iter ( )
5262 . map ( |dir| format ! ( "../exercises/{dir}/README.md" ) ) ;
5363
54- let input_file_names = info. input_files . iter ( ) . map ( |f| f. name ) ;
55- let input_file_paths = info
56- . input_files
57- . iter ( )
58- . map ( |f| format ! ( "../input_files/{}" , f. name) ) ;
59-
6064 quote ! {
6165 EmbeddedFiles {
6266 info_file: #info_file,
63- exercise_files: & [ #( ExerciseFiles { exercise: include_bytes!( #exercise_files) , solution: include_bytes!( #solution_files) , dir_ind: #dir_inds } ) , * ] ,
67+ exercise_files: & [ #( ExerciseFiles {
68+ exercise: include_bytes!( #exercise_files) ,
69+ solution: include_bytes!( #solution_files) ,
70+ dir_ind: #dir_inds,
71+ input_files: #input_files,
72+ } ) , * ] ,
6473 exercise_dirs: & [ #( ExerciseDir { name: #dirs, readme: include_bytes!( #readmes) } ) , * ] ,
65- input_files: & [ #( InputFile { name: #input_file_names, content: include_str!( #input_file_paths) } ) , * ] ,
6674 }
6775 }
6876 . into ( )
0 commit comments