From 4b04e9feee75c7c7383217db811900a280ce0cde Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Sat, 10 Jul 2021 16:12:20 -0700 Subject: [PATCH] move `detect_pkgname` and `detct_mainfile` from cmd/init to util --- src/cmd/init.zig | 47 ++++++++++++++-------------------------------- src/util/funcs.zig | 40 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 35 deletions(-) diff --git a/src/cmd/init.zig b/src/cmd/init.zig index 55469cb52640a3243c7c0f9acf4d4c877e038e6d..be87f7787824ef74ba1f41c3dbeeafe23677f97e 100644 --- a/src/cmd/init.zig +++ b/src/cmd/init.zig @@ -7,8 +7,20 @@ const u = @import("./../util/index.zig"); // pub fn execute(args: [][]u8) !void { - const name = try detect_pkgname(u.try_index([]const u8, args, 0, "")); - const mainf = try detct_mainfile(u.try_index([]const u8, args, 1, "")); + const name = u.detect_pkgname(u.try_index([]const u8, args, 0, ""), null) catch |err| switch (err) { + error.NoBuildZig => { + u.assert(false, "init requires a build.zig file", .{}); + unreachable; + }, + else => return err, + }; + const mainf = u.detct_mainfile(u.try_index([]const u8, args, 1, ""), null, name) catch |err| switch (err) { + error.CantFindMain => { + u.assert(false, "unable to detect package entry point", .{}); + unreachable; + }, + else => return err, + }; const file = try std.fs.cwd().createFile("zig.mod", .{}); defer file.close(); @@ -21,34 +33,3 @@ pub fn execute(args: [][]u8) !void { u.print("Initialized a new package named {s} with entry point {s}", .{ name, mainf }); } - -fn detect_pkgname(def: []const u8) ![]const u8 { - if (def.len > 0) { - return def; - } - u.assert(try u.does_file_exist("build.zig"), "init requires a build.zig file", .{}); - const dpath = try std.fs.cwd().realpathAlloc(gpa, "build.zig"); - const split = try u.split(dpath, std.fs.path.sep_str); - var name = split[split.len - 2]; - name = u.trim_prefix(name, "zig-"); - u.assert(name.len > 0, "package name must not be an empty string", .{}); - return name; -} - -fn detct_mainfile(def: []const u8) ![]const u8 { - if (def.len > 0) { - if (try u.does_file_exist(def)) { - if (std.mem.endsWith(u8, def, ".zig")) { - return def; - } - } - } - if (try u.does_file_exist(try std.fs.path.join(gpa, &.{ "src", "lib.zig" }))) { - return "src/lib.zig"; - } - if (try u.does_file_exist(try std.fs.path.join(gpa, &.{ "src", "main.zig" }))) { - return "src/main.zig"; - } - u.assert(false, "unable to detect package entry point", .{}); - unreachable; -} diff --git a/src/util/funcs.zig b/src/util/funcs.zig index fe814321c639ac5a43da637c785adc4a014071f4..c29f64ed773b75effd8e836ec208dbf8c1298bdc 100644 --- a/src/util/funcs.zig +++ b/src/util/funcs.zig @@ -49,8 +49,8 @@ pub fn trim_prefix(in: []const u8, prefix: []const u8) []const u8 { return in; } -pub fn does_file_exist(fpath: []const u8) !bool { - const file = std.fs.cwd().openFile(fpath, .{}) catch |e| switch (e) { +pub fn does_file_exist(fpath: []const u8, dir: ?std.fs.Dir) !bool { + const file = (dir orelse std.fs.cwd()).openFile(fpath, .{}) catch |e| switch (e) { error.FileNotFound => return false, error.IsDir => return true, else => return e, @@ -265,3 +265,39 @@ pub fn slice(comptime T: type, input: []const T, from: usize, to: usize) []const const t = std.math.min(to, input.len); return input[f..t]; } + +pub fn detect_pkgname(override: []const u8, dir: ?std.fs.Dir) ![]const u8 { + if (override.len > 0) { + return override; + } + if (!(try does_file_exist("build.zig", dir))) { + return error.NoBuildZig; + } + const dpath = try (dir orelse std.fs.cwd()).realpathAlloc(gpa, "build.zig"); + const splitP = try split(dpath, std.fs.path.sep_str); + var name = splitP[splitP.len - 2]; + name = trim_prefix(name, "zig-"); + assert(name.len > 0, "package name must not be an empty string", .{}); + return name; +} + +pub fn detct_mainfile(override: []const u8, dir: ?std.fs.Dir, name: []const u8) ![]const u8 { + if (override.len > 0) { + if (try does_file_exist(override, dir)) { + if (std.mem.endsWith(u8, override, ".zig")) { + return override; + } + } + } + const namedotzig = try std.mem.concat(gpa, u8, &.{ name, ".zig" }); + if (try does_file_exist(namedotzig, dir)) { + return namedotzig; + } + if (try does_file_exist(try std.fs.path.join(gpa, &.{ "src", "lib.zig" }), dir)) { + return "src/lib.zig"; + } + if (try does_file_exist(try std.fs.path.join(gpa, &.{ "src", "main.zig" }), dir)) { + return "src/main.zig"; + } + return error.CantFindMain; +} -- 2.54.0