| 1 | const std = @import("std"); |
| 2 | const gpa = std.heap.c_allocator; |
| 3 | const extras = @import("extras"); |
| 4 | const nfs = @import("nfs"); |
| 5 | |
| 6 | const zpm = @import("./../zpm.zig"); |
| 7 | |
| 8 | // |
| 9 | // |
| 10 | |
| 11 | pub fn execute(self_name: []const u8, args: []const [:0]const u8) !void { |
| 12 | _ = self_name; |
| 13 | _ = args; |
| 14 | |
| 15 | const out = nfs.stdout(); |
| 16 | |
| 17 | const url = try std.mem.join(gpa, "/", &.{ zpm.server_root, "packages" }); |
| 18 | const list = try zpm.server_fetchArray(url); |
| 19 | |
| 20 | const name_col_width = blk: { |
| 21 | var w: usize = 4; |
| 22 | for (list) |pkg| { |
| 23 | const len = pkg.name.len; |
| 24 | if (len > w) { |
| 25 | w = len; |
| 26 | } |
| 27 | } |
| 28 | break :blk w + 2; |
| 29 | }; |
| 30 | |
| 31 | const author_col_width = blk: { |
| 32 | var w: usize = 6; |
| 33 | for (list) |pkg| { |
| 34 | const len = pkg.author.len; |
| 35 | if (len > w) { |
| 36 | w = len; |
| 37 | } |
| 38 | } |
| 39 | break :blk w + 2; |
| 40 | }; |
| 41 | |
| 42 | try out.writeAll("NAME"); |
| 43 | try print_c_n(out, ' ', name_col_width - 4); |
| 44 | try out.writeAll("AUTHOR"); |
| 45 | try print_c_n(out, ' ', author_col_width - 6); |
| 46 | try out.writeAll("DESCRIPTION\n"); |
| 47 | |
| 48 | for (list) |pkg| { |
| 49 | try out.writeAll(pkg.name); |
| 50 | try print_c_n(out, ' ', name_col_width - pkg.name.len); |
| 51 | |
| 52 | try out.writeAll(pkg.author); |
| 53 | try print_c_n(out, ' ', author_col_width - pkg.author.len); |
| 54 | |
| 55 | try out.writeAll(pkg.description); |
| 56 | try out.writeAll("\n"); |
| 57 | } |
| 58 | } |
| 59 | |
| 60 | fn print_c_n(out: anytype, c: u8, n: usize) !void { |
| 61 | for (0..n) |_| { |
| 62 | try out.writeAll(&.{c}); |
| 63 | } |
| 64 | } |