╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ fetch_them_macos_headers.zig ─────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭ find file ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╮ ╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │ │ │http│ ssh │ │ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╯ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
214 } 215 } 216 217 const ArgsIterator = struct { 218 args: []const []const u8, 219 i: usize = 0, 220 221 fn next(it: *@This()) ?[]const u8 { 222 if (it.i >= it.args.len) { 223 return null; 224 } 225 defer it.i += 1; 226 return it.args[it.i]; 227 } 228 229 fn nextOrFatal(it: *@This()) []const u8 { 230 const arg = it.next() orelse fatal("expected parameter after '{s}'", .{it.args[it.i - 1]}); 231 return arg; 232 } 233 }; 234 235 const Version = struct { 236 major: u16, 237 minor: u8, 238 patch: u8, 239 240 fn parse(raw: []const u8) ?Version { 241 var parsed: [3]u16 = @splat(0); 242 var count: usize = 0; 243 var it = std.mem.splitAny(u8, raw, "."); 244 while (it.next()) |comp| { 245 if (count >= 3) return null; 246 parsed[count] = std.fmt.parseInt(u16, comp, 10) catch return null; 247 count += 1; 248 } 249 if (count == 0) return null; 250 const major = parsed[0]; 251 const minor = std.math.cast(u8, parsed[1]) orelse return null; 252 const patch = std.math.cast(u8, parsed[2]) orelse return null; 253 return .{ .major = major, .minor = minor, .patch = patch }; 254 } 255 256 pub fn format( 257 v: Version, 258 writer: *Io.Writer, 259 ) Io.Writer.Error!void { 260 try writer.print("{d}.{d}.{d}", .{ v.major, v.minor, v.patch }); 261 } 262 }; 263