From ab662f27cf388cb3ce1a93dbd77c1f5b290672b7 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Fri, 7 May 2021 20:05:08 -0700 Subject: [PATCH] add `zpm search` command --- src/cmd/zpm.zig | 2 ++ src/cmd/zpm/search.zig | 81 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 src/cmd/zpm/search.zig diff --git a/src/cmd/zpm.zig b/src/cmd/zpm.zig index 35277f6b41d5fe43eb97c5091a0cfd250cf0077a..b3329aadc45432d502d3506b906e206ae7a7c4aa 100644 --- a/src/cmd/zpm.zig +++ b/src/cmd/zpm.zig @@ -13,6 +13,7 @@ pub const commands = struct { pub const add = @import("./zpm/add.zig"); pub const showjson = @import("./zpm/showjson.zig"); pub const tags = @import("./zpm/tags.zig"); + pub const search = @import("./zpm/search.zig"); }; pub const server_root = "https://zpm.random-projects.net/api"; @@ -37,6 +38,7 @@ pub fn execute(args: [][]u8) !void { \\ - add Append this package to your dependencies \\ - showjson Print raw json from queried API responses \\ - tags Print the list of tags available on the server. + \\ - search Search the api for available packages and print them. }); return; } diff --git a/src/cmd/zpm/search.zig b/src/cmd/zpm/search.zig new file mode 100644 index 0000000000000000000000000000000000000000..b75106a0df671487dea985c8c983806e079d86bb --- /dev/null +++ b/src/cmd/zpm/search.zig @@ -0,0 +1,81 @@ +const std = @import("std"); +const gpa = std.heap.c_allocator; +const out = std.io.getStdOut().writer(); + +const zfetch = @import("zfetch"); +const json = @import("json"); +const range = @import("range").range; + +const u = @import("./../../util/index.zig"); +const zpm = @import("./../zpm.zig"); + +// +// + +pub fn execute(args: [][]u8) !void { + const url = try std.mem.join(gpa, "/", &.{ zpm.server_root, "packages" }); + const val = try zpm.server_fetch(url); + + const arr = &std.ArrayList(zpm.Package).init(gpa); + defer arr.deinit(); + + for (val.Array) |item| { + if (item.get("root_file")) |_| {} else { + continue; + } + try arr.append(zpm.Package{ + .name = item.get("name").?.String, + .author = item.get("author").?.String, + .description = item.get("description").?.String, + .tags = &.{}, + .git = "", + .root_file = "", + }); + } + const list = arr.items; + + const name_col_width = blk: { + var w: usize = 4; + for (list) |pkg| { + const len = pkg.name.len; + if (len > w) { + w = len; + } + } + break :blk w + 2; + }; + + const author_col_width = blk: { + var w: usize = 6; + for (list) |pkg| { + const len = pkg.author.len; + if (len > w) { + w = len; + } + } + break :blk w + 2; + }; + + try out.writeAll("NAME"); + try print_c_n(' ', name_col_width - 4); + try out.writeAll("AUTHOR"); + try print_c_n(' ', author_col_width - 6); + try out.writeAll("DESCRIPTION\n"); + + for (list) |pkg| { + try out.writeAll(pkg.name); + try print_c_n(' ', name_col_width - pkg.name.len); + + try out.writeAll(pkg.author); + try print_c_n(' ', author_col_width - pkg.author.len); + + try out.writeAll(pkg.description); + try out.writeAll("\n"); + } +} + +fn print_c_n(c: u8, n: usize) !void { + for (range(n)) |_| { + try out.writeAll(&.{c}); + } +} -- 2.54.0