@ -240,7 +240,7 @@ const ZiglingStep = struct {
return self ;
}
fn make ( step : * Step , prog_node : * std . Progress . Node ) anyerror ! void {
fn make ( step : * Step , prog_node : * std . Progress . Node ) ! void {
const self = @fieldParentPtr ( @This ( ) , " step " , step ) ;
if ( self . exercise . skip ) {
@ -248,28 +248,33 @@ const ZiglingStep = struct {
return ;
}
self . makeInternal ( prog_node ) catch {
const exe_path = self . compile ( prog_node ) catch {
if ( self . exercise . hint . len > 0 ) {
print ( " \n {s}HINT: {s}{s} " , . { bold_text , self . exercise . hint , reset_text } ) ;
}
print ( " \n {s}Edit exercises/{s} and run this again.{s} " , . { red_text , self . exercise . main_file , reset_text } ) ;
print ( " \n {s}To continue from this zigling, use this command:{s} \n {s}zig build -Dn={s}{s} \n " , . { red_text , reset_text , bold_text , self . exercise . key ( ) , reset_text } ) ;
self . help ( ) ;
std . os . exit ( 1 ) ;
} ;
}
fn makeInternal ( self : * @This ( ) , prog_node : * std . Progress . Node ) ! void {
print ( " Compiling {s}... \n " , . { self . exercise . main_file } ) ;
self . run ( exe_path , prog_node ) catch {
if ( self . exercise . hint . len > 0 ) {
print ( " \n {s}HINT: {s}{s} " , . { bold_text , self . exercise . hint , reset_text } ) ;
}
const exe_file = try self . doCompile ( prog_node ) ;
self . help ( ) ;
std . os . exit ( 1 ) ;
} ;
}
fn run ( self : * @This ( ) , exe_path : [ ] const u8 , _ : * std . Progress . Node ) ! void {
resetLine ( ) ;
print ( " Checking {s}... \n " , . { self . exercise . main_file } ) ;
const cwd = self . builder . build_root . path . ? ;
const argv = [ _ ] [ ] const u8 { exe_ file } ;
const argv = [ _ ] [ ] const u8 { exe_ path } ;
var child = std . ChildProcess . init ( & argv , self . builder . allocator ) ;
@ -336,9 +341,9 @@ const ZiglingStep = struct {
print ( " {s}PASSED: \n {s}{s} \n \n " , . { green_text , trimOutput , reset_text } ) ;
}
/ / The normal compile step calls os . exit , so we can ' t use it as a library : (
/ / This is a stripped down copy of std . build . LibExeObjStep . make .
fn doCompile ( self : * @This ( ) , prog_node : * std . Progress . Node ) ! [ ] const u8 {
fn compile ( self : * @This ( ) , prog_node : * std . Progress . Node ) ! [ ] const u8 {
print ( " Compiling {s}... \n " , . { self . exercise . main_file } ) ;
const builder = self . builder ;
var zig_args = std . ArrayList ( [ ] const u8 ) . init ( builder . allocator ) ;
@ -362,7 +367,7 @@ const ZiglingStep = struct {
const argv = zig_args . items ;
var code : u8 = undefined ;
const file_name = self . eval ( argv , & code , prog_node ) catch | err | {
const exe_path = self . eval ( argv , & code , prog_node ) catch | err | {
self . printErrors ( ) ;
switch ( err ) {
@ -397,7 +402,7 @@ const ZiglingStep = struct {
} ;
self . printErrors ( ) ;
return file_name ;
return exe_path ;
}
/ / Code adapted from ` std . Build . execAllowFail and ` std . Build . Step . evalZigProcess ` .
@ -500,6 +505,23 @@ const ZiglingStep = struct {
return result orelse return error . ZigIPCError ;
}
fn help ( self : * ZiglingStep ) void {
const path = self . exercise . main_file ;
const key = self . exercise . key ( ) ;
print ( " \n {s}Edit exercises/{s} and run this again.{s} " , . {
red_text , path , reset_text ,
} ) ;
const format =
\\
\\{s}To continue from this zigling, use this command:{s}
\\ {s}zig build -Dn={s}{s}
\\
;
print ( format , . { red_text , reset_text , bold_text , key , reset_text } ) ;
}
fn printErrors ( self : * ZiglingStep ) void {
resetLine ( ) ;