/ src / main.zig
main.zig
 1  const std = @import("std");
 2  
 3  pub const std_options = std.Options{
 4      .log_level = .debug,
 5  };
 6  
 7  const options = @import("build-options");
 8  const days = @import("days.zig");
 9  
10  pub fn main() !void {
11      const day = blk: {
12          if (options.day) |d| break :blk d;
13  
14          std.log.err("please specify which day to build with the `-Dday` flag", .{});
15          return;
16      };
17  
18      var gpa = std.heap.GeneralPurposeAllocator(.{}){};
19      const allocator = gpa.allocator();
20      defer {
21          const deinit_status = gpa.deinit();
22          if (deinit_status == .leak) @panic("Memory leak");
23      }
24  
25      const day_str = try std.fmt.allocPrint(allocator, "Day {} - Advent of Code 2022", .{day});
26      defer allocator.free(day_str);
27  
28      var progress = std.Progress.start(.{ .root_name = day_str });
29      defer progress.end();
30  
31      var timer = try std.time.Timer.start();
32      try days.run(allocator, &progress);
33      const excution_time = timer.lap();
34      printTimerResult(excution_time);
35  }
36  
37  fn printTimerResult(t: u64) void {
38      var rt = t;
39  
40      const hours = rt / std.time.ns_per_hour;
41      rt = rt - (hours * std.time.ns_per_hour);
42  
43      const minutes = rt / std.time.ns_per_min;
44      rt = rt - (minutes * std.time.ns_per_min);
45  
46      const seconds = rt / std.time.ns_per_s;
47      rt = rt - (seconds * std.time.ns_per_s);
48  
49      const ms = rt / std.time.ns_per_ms;
50      rt = rt - (ms * std.time.ns_per_ms);
51  
52      std.log.info(
53          "Executed in: {}h {}m {}s {}ms (raw ms: {}ms)",
54          .{ hours, minutes, seconds, ms, t / std.time.ns_per_ms },
55      );
56  }