66	"os/exec" 
77	"path/filepath" 
88	"plugin" 
9+ 	"strings" 
910)
1011
1112type  PluginProcessor  struct  {
@@ -32,7 +33,7 @@ func (p PluginProcessor) CallFunc(input *[]byte) (string, error) {
3233	}
3334
3435	// Look up the Process function 
35- 	symProcess , err  :=  plug .Lookup ("Part"  +  p .Args .part )
36+ 	symProcess , err  :=  plug .Lookup ("Part"  +  p .Args .Part )
3637	if  err  !=  nil  {
3738		return  "" , fmt .Errorf ("error looking up process: %v" , err )
3839	}
@@ -47,22 +48,24 @@ func (p PluginProcessor) CallFunc(input *[]byte) (string, error) {
4748	return  processFunc (string (* input )), nil 
4849}
4950
50- func  (p  PluginProcessor ) RunTests () {
51- 	cmd  :=  exec .Command ("go" , "test" , fmt .Sprintf ("./%s/day%s/" , p .Args .year , p .Args .day ))
51+ func  (p  PluginProcessor ) RunTests () error   {
52+ 	cmd  :=  exec .Command ("go" , "test" , fmt .Sprintf ("./%s/day%s/" , p .Args .Year , p .Args .Day ))
5253	cmd .Stdout  =  os .Stdout 
5354	cmd .Stderr  =  os .Stderr 
5455
5556	fmt .Printf ("\n Running tests: %s\n " , cmd .String ())
5657
5758	if  err  :=  cmd .Run (); err  !=  nil  {
5859		fmt .Println ("Tests failed." )
59- 		return 
60+ 		return   err 
6061	}
62+ 
63+ 	return  nil 
6164}
6265
6366func  (p  PluginProcessor ) GetInput () (* []byte , error ) {
6467	// Determine the input file path 
65- 	path  :=  filepath .Join ("./" , p .Args .year , "day" + p .Args .day , "input.txt" )
68+ 	path  :=  filepath .Join ("./" , p .Args .Year , "day" + p .Args .Day , "input.txt" )
6669
6770	// Read the input file 
6871	data , err  :=  os .ReadFile (path )
@@ -76,3 +79,59 @@ func (p PluginProcessor) GetInput() (*[]byte, error) {
7679
7780	return  & data , nil 
7881}
82+ 
83+ func  GetAllPluginProcessors (args  Args ) ([]PluginProcessor , error ) {
84+ 	var  baseDir  =  filepath .Join ("./" , args .Year )
85+ 	var  processors  []PluginProcessor 
86+ 
87+ 	err  :=  filepath .Walk (baseDir , func (path  string , info  os.FileInfo , err  error ) error  {
88+ 		if  err  !=  nil  {
89+ 			return  err 
90+ 		}
91+ 
92+ 		if  info .IsDir () {
93+ 			return  nil 
94+ 		}
95+ 
96+ 		parts  :=  strings .Split (path , string (os .PathSeparator ))
97+ 		if  len (parts ) !=  3  {
98+ 			return  nil 
99+ 		}
100+ 
101+ 		if  ! strings .HasPrefix (parts [1 ], "day" ) {
102+ 			return  nil 
103+ 		}
104+ 
105+ 		if  ! strings .HasPrefix (parts [2 ], "part" ) ||  strings .Contains (parts [2 ], "test" ) ||  ! strings .HasSuffix (parts [2 ], ".go" ) {
106+ 			return  nil 
107+ 		}
108+ 
109+ 		year  :=  parts [0 ]
110+ 		day  :=  parts [1 ][3 :]
111+ 		part  :=  parts [2 ][4  : len (parts [2 ])- 3 ]
112+ 
113+ 		args  :=  Args {
114+ 			Year : year ,
115+ 			Day :  day ,
116+ 			Part : part ,
117+ 		}
118+ 		args .path , err  =  args .getPath ()
119+ 		if  err  !=  nil  {
120+ 			return  err 
121+ 		}
122+ 
123+ 		processors  =  append (processors , PluginProcessor {
124+ 			Args : args ,
125+ 		})
126+ 
127+ 		return  nil 
128+ 	})
129+ 
130+ 	if  err  !=  nil  {
131+ 		fmt .Println ("Error scanning directories:" , err )
132+ 
133+ 		return  nil , err 
134+ 	}
135+ 
136+ 	return  processors , nil 
137+ }
0 commit comments