commit f5a1dca0b18f0f67e967dbe61016f403bf9c8e45
Author: Nathan Anderson <nathananderson98@gmail.com>
Date:   Thu Oct 26 18:54:59 2023 -0600

    initial commit

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/build.zig b/build.zig
new file mode 100644
index 0000000..b80f909
--- /dev/null
+++ b/build.zig
@@ -0,0 +1,105 @@
+const std = @import("std");
+
+pub fn build(b: *std.Build) !void {
+    const target = b.standardTargetOptions(.{});
+
+    // Standard optimization options allow the person running `zig build` to select
+    // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not
+    // set a preferred release mode, allowing the user to decide how to optimize.
+    const optimize = b.standardOptimizeOption(.{});
+
+    const exe = b.addExecutable(.{
+        .name = "zx",
+        // In this case the main source file is merely a path, however, in more
+        // complicated build scripts, this could be a generated file.
+        .root_source_file = .{ .path = "src/main.zig" },
+        .target = target,
+        .optimize = optimize,
+    });
+
+    // This declares intent for the library to be installed into the standard
+    // location when the user invokes the "install" step (the default step when
+    // running `zig build`).
+    b.installArtifact(exe);
+
+    const run_cmd = b.addRunArtifact(exe);
+
+    // By making the run step depend on the install step, it will be run from the
+    // installation directory rather than directly from within the cache directory.
+    // This is not necessary, however, if the application depends on other installed
+    // files, this ensures they will be present and in the expected location.
+    run_cmd.step.dependOn(b.getInstallStep());
+
+    // This allows the user to pass arguments to the application in the build
+    // command itself, like this: `zig build run -- arg1 arg2 etc`
+    if (b.args) |args| {
+        run_cmd.addArgs(args);
+    }
+
+    // This creates a build step. It will be visible in the `zig build --help` menu,
+    // and can be selected like this: `zig build run`
+    // This will evaluate the `run` step rather than the default, which is "install".
+    const run_step = b.step("run", "Run the app");
+    run_step.dependOn(&run_cmd.step);
+
+     // Creates a step for unit testing. This only builds the test executable
+    // but does not run it.
+    const main_tests = b.addTest(.{
+        .root_source_file = .{ .path = "src/main.zig" },
+        .target = target,
+        .optimize = optimize,
+    });
+
+    const run_main_tests = b.addRunArtifact(main_tests);
+
+    // This creates a build step. It will be visible in the `zig build --help` menu,
+    // and can be selected like this: `zig build test`
+    // This will evaluate the `test` step rather than the default, which is "install".
+    const test_step = b.step("test", "Run library tests");
+    test_step.dependOn(&run_main_tests.step);
+
+    // Setup comptime parsing for /lib files
+    var markup_files = std.ArrayList([]const u8).init(b.allocator);
+    var zig_files = std.ArrayList([]const u8).init(b.allocator);
+    defer markup_files.deinit();
+    defer zig_files.deinit();
+
+    var options = b.addOptions();
+
+    // Add all files names in the src folder to `files`
+    var dir = try std.fs.cwd().openIterableDir("lib", .{});
+    var lib_walker = try dir.walk(b.allocator);
+    var walking = true;
+    while (walking) blk: {
+        var file = lib_walker.next() catch {
+            walking = false;
+            break :blk;
+        };
+        if (file == null) {
+            walking = false;
+            break :blk;
+        }
+        if (file.?.kind == .file) {
+            const path = file.?.path;
+            var split_iter = std.mem.splitBackwardsAny(u8, path, ".");
+            var extension = split_iter.first();
+            if (std.mem.eql(u8, extension, "zig")) {
+                std.debug.print("Adding zig file {s}...\n", .{path});
+                try zig_files.append(b.dupe(path));
+            }
+            else if (std.mem.eql(u8, extension, "html")) {
+                std.debug.print("Adding markup file {s}...\n", .{path});
+                try markup_files.append(b.dupe(path));
+            } else {
+                std.debug.print("Unrecognized file extension {s}\t{s}\n", .{extension, path});
+            }
+       }
+        // std.debug.print("Got entry in `versions:` base: {s}, path: {s}, kind: {any}\n", .{ ver.?.basename, ver.?.path, ver.?.kind });
+    }
+
+    // Add the file names as an option to the exe, making it available
+    // as a string array at comptime in main.zig
+    options.addOption([]const []const u8, "zig_files", zig_files.items);
+    options.addOption([]const []const u8, "markup_files", markup_files.items);
+    exe.addOptions("options", options);
+}
diff --git a/src/main.zig b/src/main.zig
new file mode 100644
index 0000000..8255398
--- /dev/null
+++ b/src/main.zig
@@ -0,0 +1,12 @@
+const std = @import("std");
+const options = @import("options");
+
+pub fn main() void {
+    std.debug.print("Ello there\n", .{});
+    comptime {
+        const route = @import(options.zig_files[0]);
+        route.get();
+        // @compileLog("Got option zig file " ++ options.zig_files[0] ++ "\n");
+    }
+    return;
+}