diff --git a/src/cmd/aq.zig b/src/cmd/aq.zig new file mode 100644 index 0000000000000000000000000000000000000000..92ae86bafdea596331c68ba9f5321e3238dd4937 --- /dev/null +++ b/src/cmd/aq.zig @@ -0,0 +1,34 @@ +const std = @import("std"); +const gpa = std.heap.c_allocator; + +const u = @import("./../util/index.zig"); + +// +// + +pub const commands = struct { + pub const add = @import("./aquila/add.zig"); +}; + +pub fn execute(args: [][]u8) !void { + if (args.len == 0) { + std.debug.warn("{s}\n", .{ + \\This is a subcommand for use with https://github.com/nektro/aquila instances but has no default behavior on its own aside from showing you this nice help text. + \\ + \\The default remote is https://aquila.red. + \\ + \\The subcommands available are: + \\ - add Append this package to your dependencies + }); + return; + } + + inline for (std.meta.declarations(commands)) |decl| { + if (std.mem.eql(u8, args[0], decl.name)) { + const cmd = @field(commands, decl.name); + try cmd.execute(args[1..]); + return; + } + } + std.debug.panic("error: unknown command \"{s}\" for \"zigmod aq\"", .{args[0]}); +} diff --git a/src/cmd/aquila/add.zig b/src/cmd/aquila/add.zig new file mode 100644 index 0000000000000000000000000000000000000000..870e81fee823cd705cd7b122c239731dac5c94f8 --- /dev/null +++ b/src/cmd/aquila/add.zig @@ -0,0 +1,65 @@ +const std = @import("std"); +const gpa = std.heap.c_allocator; + +const zfetch = @import("zfetch"); +const json = @import("json"); + +const u = @import("./../../util/index.zig"); + +// +// + +pub fn execute(args: [][]u8) !void { + const pkg_id = args[0]; + + const url = try std.mem.join(gpa, "/", &.{ "https://aquila.red", pkg_id }); + + const req = try zfetch.Request.init(gpa, url, null); + defer req.deinit(); + + var headers = zfetch.Headers.init(gpa); + defer headers.deinit(); + try headers.set("accept", "application/json"); + + try req.do(.GET, headers, null); + + const r = req.reader(); + const body_content = try r.readAllAlloc(gpa, std.math.maxInt(usize)); + const val = try json.parse(gpa, body_content); + + if (val.get("message")) |msg| { + std.log.err("server: {s}", .{msg.String}); + return; + } + + const name = val.get(.{ "pkg", "name" }).?.String; + + const versions = val.get("versions").?.Array; + const to_add = versions[versions.len - 1]; + + const self_module = try u.ModFile.init(gpa, "zig.mod"); + for (self_module.deps) |dep| { + if (std.mem.eql(u8, dep.name, name)) { + std.log.warn("dependency with name '{s}' already exists in your dependencies", .{name}); + } + } + for (self_module.devdeps) |dep| { + if (std.mem.eql(u8, dep.name, name)) { + std.log.warn("dependency with name '{s}' already exists in your dependencies", .{name}); + } + } + + const file = try std.fs.cwd().openFile("zig.mod", .{ .read = true, .write = true }); + try file.seekTo(try file.getEndPos()); + + const v_hash = to_add.get("tar_hash").?.String; + const v_maj = to_add.get("real_major").?.Number; + const v_min = to_add.get("real_minor").?.Number; + + const file_w = file.writer(); + try file_w.print("\n", .{}); + try file_w.print(" - src: http https://aquila.red/{s}/v{d}.{d}.tar.gz _ {d} {d}\n", .{ pkg_id, v_maj, v_min, v_maj, v_min }); + try file_w.print(" version: {s}\n", .{v_hash}); + + std.log.info("Successfully added package {s}", .{pkg_id}); +} diff --git a/src/lib.zig b/src/lib.zig index 8970c5e38c7cf9673236693b759e05ca0cbb79ec..e93cf8bc70a7bce6460766fbea3c37e775d12d95 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -8,4 +8,5 @@ pub const commands = struct { pub const sum = @import("./cmd/sum.zig"); pub const zpm = @import("./cmd/zpm.zig"); pub const license = @import("./cmd/license.zig"); + pub const aq = @import("./cmd/aq.zig"); };