Working initial version with linux and firefox limitation, added ref and std subcommands
				
					
				
			This commit is contained in:
		
							parent
							
								
									ecb19ad647
								
							
						
					
					
						commit
						9198cb7642
					
				
							
								
								
									
										60
									
								
								src/main.zig
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								src/main.zig
									
									
									
									
									
								
							@ -10,12 +10,14 @@ pub const ZIM_BUILD = 1;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/// The availble arguments for the ZiM program
 | 
					/// The availble arguments for the ZiM program
 | 
				
			||||||
const Args = enum(u8) {
 | 
					const Args = enum(u8) {
 | 
				
			||||||
 | 
					    gir,
 | 
				
			||||||
    help,
 | 
					    help,
 | 
				
			||||||
    init,
 | 
					    init,
 | 
				
			||||||
    install,
 | 
					    install,
 | 
				
			||||||
    list,
 | 
					    list,
 | 
				
			||||||
 | 
					    ref,
 | 
				
			||||||
 | 
					    std,
 | 
				
			||||||
    use,
 | 
					    use,
 | 
				
			||||||
    gir,
 | 
					 | 
				
			||||||
    version,
 | 
					    version,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -41,6 +43,8 @@ fn get_arg_parse_type(arg: Args) ArgType {
 | 
				
			|||||||
        .init => ArgType.single,
 | 
					        .init => ArgType.single,
 | 
				
			||||||
        .install => ArgType.expectsOneParam,
 | 
					        .install => ArgType.expectsOneParam,
 | 
				
			||||||
        .list => ArgType.expectsOneParam,
 | 
					        .list => ArgType.expectsOneParam,
 | 
				
			||||||
 | 
					        .ref => ArgType.single,
 | 
				
			||||||
 | 
					        .std => ArgType.single,
 | 
				
			||||||
        .use => ArgType.expectsOneParam,
 | 
					        .use => ArgType.expectsOneParam,
 | 
				
			||||||
        .version => ArgType.single,
 | 
					        .version => ArgType.single,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@ -54,8 +58,10 @@ fn command_desc(arg: Args) string {
 | 
				
			|||||||
        .init => "  init\t\tAdds the necessary PATH to the system env",
 | 
					        .init => "  init\t\tAdds the necessary PATH to the system env",
 | 
				
			||||||
        .install => "  install\tInstall the zig version",
 | 
					        .install => "  install\tInstall the zig version",
 | 
				
			||||||
        .list => "  list\t\tLists all versions available on the system",
 | 
					        .list => "  list\t\tLists all versions available on the system",
 | 
				
			||||||
 | 
					        .ref => "  ref\t\tOpens the zig lang reference",
 | 
				
			||||||
 | 
					        .std => "  std\t\tOpens the std docs for the current zig version",
 | 
				
			||||||
        .use => "  use\t\tSets the active version of zig to use",
 | 
					        .use => "  use\t\tSets the active version of zig to use",
 | 
				
			||||||
        .version => "  version\t\tPrint out the zim version you are using",
 | 
					        .version => "  version\tPrint out the zim version you are using",
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -106,7 +112,7 @@ fn show_context_help(arg: Args) void {
 | 
				
			|||||||
                \\
 | 
					                \\
 | 
				
			||||||
            , .{});
 | 
					            , .{});
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        .gir, .help, .init, .version => {
 | 
					        .gir, .help, .init, .ref, .std, .version => {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -124,25 +130,11 @@ fn do_arg_action(allocator: std.mem.Allocator, arg: Args, param: ?[]const u8) vo
 | 
				
			|||||||
        .init => {
 | 
					        .init => {
 | 
				
			||||||
            zim.init(allocator) catch |err| {
 | 
					            zim.init(allocator) catch |err| {
 | 
				
			||||||
                std.debug.print("Error running `init`\n{any}\n", .{err});
 | 
					                std.debug.print("Error running `init`\n{any}\n", .{err});
 | 
				
			||||||
 | 
					                std.os.exit(1);
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            std.os.exit(1);
 | 
					            std.os.exit(0);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        .version => {
 | 
					 | 
				
			||||||
            const ver = versionStr(allocator) catch {
 | 
					 | 
				
			||||||
                std.debug.print("Error getting version\n", .{});
 | 
					 | 
				
			||||||
                return;
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
            defer allocator.free(ver);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (param) |command| {
 | 
					 | 
				
			||||||
                std.debug.print("{s}\nRunning ZiM Version {s}\n", .{ command, ver });
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                std.debug.print("Running ZiM Version {s}\n", .{ver});
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            utils.printGir();
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        .install => {
 | 
					        .install => {
 | 
				
			||||||
            if (param == null) {
 | 
					            if (param == null) {
 | 
				
			||||||
                std.debug.print("Error: Expected index or version name to follow.\nRun `zim install help` for details.\n\n", .{});
 | 
					                std.debug.print("Error: Expected index or version name to follow.\nRun `zim install help` for details.\n\n", .{});
 | 
				
			||||||
@ -181,6 +173,21 @@ fn do_arg_action(allocator: std.mem.Allocator, arg: Args, param: ?[]const u8) vo
 | 
				
			|||||||
                std.os.exit(1);
 | 
					                std.os.exit(1);
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        .ref => {
 | 
				
			||||||
 | 
					            zim.open_ref(allocator) catch |err| {
 | 
				
			||||||
 | 
									std.debug.print("Error running `ref`\n{any}\n", .{err});
 | 
				
			||||||
 | 
									std.os.exit(1);
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            std.os.exit(0);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        .std => {
 | 
				
			||||||
 | 
					            zim.open_std(allocator) catch |err| {
 | 
				
			||||||
 | 
					          		std.debug.print("Error running `ref`\n{any}\n", .{err});
 | 
				
			||||||
 | 
									std.os.exit(1);
 | 
				
			||||||
 | 
					           };
 | 
				
			||||||
 | 
					           std.os.exit(0);
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        .use => {
 | 
					        .use => {
 | 
				
			||||||
            if (param == null) {
 | 
					            if (param == null) {
 | 
				
			||||||
                std.debug.print("Error: Expected version or index to follow.\nRun `zim use help` for details.\n\n", .{});
 | 
					                std.debug.print("Error: Expected version or index to follow.\nRun `zim use help` for details.\n\n", .{});
 | 
				
			||||||
@ -197,6 +204,21 @@ fn do_arg_action(allocator: std.mem.Allocator, arg: Args, param: ?[]const u8) vo
 | 
				
			|||||||
                std.os.exit(1);
 | 
					                std.os.exit(1);
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        .version => {
 | 
				
			||||||
 | 
					            const ver = versionStr(allocator) catch {
 | 
				
			||||||
 | 
					                std.debug.print("Error getting version\n", .{});
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            defer allocator.free(ver);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (param) |command| {
 | 
				
			||||||
 | 
					                std.debug.print("{s}\nRunning ZiM Version {s}\n", .{ command, ver });
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                std.debug.print("Running ZiM Version {s}\n", .{ver});
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            utils.printGir();
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										59
									
								
								src/zim.zig
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								src/zim.zig
									
									
									
									
									
								
							@ -115,7 +115,7 @@ fn getLocalVersionsList(
 | 
				
			|||||||
fn getRemoteVersionsSlice(allocator: std.mem.Allocator) ZimError![]const ZigVersion {
 | 
					fn getRemoteVersionsSlice(allocator: std.mem.Allocator) ZimError![]const ZigVersion {
 | 
				
			||||||
    // Check local file first for chached network call first
 | 
					    // Check local file first for chached network call first
 | 
				
			||||||
    const zim_dir = try openZimDir(allocator);
 | 
					    const zim_dir = try openZimDir(allocator);
 | 
				
			||||||
    const now = @as(i128, @intCast(std.time.timestamp())) * 1000 * 1000;
 | 
					    const now = @as(i128, @intCast(std.time.timestamp())) * 1000 * 1000 * 1000;
 | 
				
			||||||
    const yesterday = now - (24 * 60 * 60 * 1000 * 1000);
 | 
					    const yesterday = now - (24 * 60 * 60 * 1000 * 1000);
 | 
				
			||||||
    var remote_versions_file = zim_dir.createFile("versions/remote_versions.json", .{ .read = true, .truncate = false }) catch {
 | 
					    var remote_versions_file = zim_dir.createFile("versions/remote_versions.json", .{ .read = true, .truncate = false }) catch {
 | 
				
			||||||
        return ZimError.BadIO;
 | 
					        return ZimError.BadIO;
 | 
				
			||||||
@ -129,14 +129,16 @@ fn getRemoteVersionsSlice(allocator: std.mem.Allocator) ZimError![]const ZigVers
 | 
				
			|||||||
        return ZimError.BadIO;
 | 
					        return ZimError.BadIO;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // std.debug.print("Got times modified: {any}, yesterday: {any}\n", .{file_metadata.modified(), yesterday});
 | 
				
			||||||
    if (file_metadata.modified() > yesterday) {
 | 
					    if (file_metadata.modified() > yesterday) {
 | 
				
			||||||
 | 
					        // std.debug.print("Getting cached result\n", .{});
 | 
				
			||||||
        body = remote_versions_file.readToEndAlloc(allocator, SIXTY_FOUR_KILOBYTES) catch |err| {
 | 
					        body = remote_versions_file.readToEndAlloc(allocator, SIXTY_FOUR_KILOBYTES) catch |err| {
 | 
				
			||||||
            std.debug.print("Could not read remote versions file: {any}\n", .{err});
 | 
					            std.debug.print("Could not read remote versions file: {any}\n", .{err});
 | 
				
			||||||
            return ZimError.Unexpected;
 | 
					            return ZimError.Unexpected;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (body.len == 0) {
 | 
					    if (body.len == 0) {
 | 
				
			||||||
        std.debug.print("No cached versions, getting remote versions\n", .{});
 | 
					        // std.debug.print("No cached versions, getting remote versions\n", .{});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Otherwise, make network call and parse
 | 
					        // Otherwise, make network call and parse
 | 
				
			||||||
        const versions_json_url = "https://ziglang.org/download/index.json";
 | 
					        const versions_json_url = "https://ziglang.org/download/index.json";
 | 
				
			||||||
@ -506,7 +508,7 @@ pub fn list(allocator: std.mem.Allocator, param: string) !void {
 | 
				
			|||||||
                    std.debug.print("  [{d}]\tzig-{s}\n", .{ index, remote_version.version_string });
 | 
					                    std.debug.print("  [{d}]\tzig-{s}\n", .{ index, remote_version.version_string });
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            std.debug.print("\nZig versions can be installed using `zim install <version or index>`\n\n", .{});
 | 
					            std.debug.print("\nZig versions can be installed using `zim install <index>`\n\n", .{});
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -517,3 +519,54 @@ pub fn init(allocator: std.mem.Allocator) !void {
 | 
				
			|||||||
    _ = allocator;
 | 
					    _ = allocator;
 | 
				
			||||||
    return ZimError.NotImplemented;
 | 
					    return ZimError.NotImplemented;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Runs the `ref` subcommand
 | 
				
			||||||
 | 
					pub fn open_ref(allocator: std.mem.Allocator) !void {
 | 
				
			||||||
 | 
					    const ref_path = "~/.config/zim/bin/zig/doc/langref.html";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var zig_ver_res = std.ChildProcess.exec(.{.allocator = allocator, .argv = &.{ "zig", "version" }, .max_output_bytes = 100},) catch |err| {
 | 
				
			||||||
 | 
							std.debug.print("Error executing `zig version`: {any}\n", .{err});
 | 
				
			||||||
 | 
							return ZimError.Unexpected;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    defer allocator.free(zig_ver_res.stdout);
 | 
				
			||||||
 | 
					    defer allocator.free(zig_ver_res.stderr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (zig_ver_res.term != .Exited) {
 | 
				
			||||||
 | 
					        std.debug.print("Expected `zig version` to exit, instead got {any}\n", .{zig_ver_res.term});
 | 
				
			||||||
 | 
					        return ZimError.Unexpected;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    const zig_ver = zig_ver_res.stdout[0..zig_ver_res.stdout.len - 1];
 | 
				
			||||||
 | 
					    std.debug.print("Opening language reference for zig-{s}...\n", .{zig_ver});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var proc = std.ChildProcess.init(&.{ "firefox", ref_path }, allocator);
 | 
				
			||||||
 | 
					    _ = proc.spawn() catch |err| {
 | 
				
			||||||
 | 
					        std.debug.print("Error while opening browser with local language reference\n{any}\n", .{err});
 | 
				
			||||||
 | 
					        return ZimError.Unexpected;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn open_std(allocator: std.mem.Allocator) !void {
 | 
				
			||||||
 | 
					     const std_path = "~/.config/zim/bin/zig/doc/std/index.html";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var zig_ver_res = std.ChildProcess.exec(.{.allocator = allocator, .argv = &.{ "zig", "version" }, .max_output_bytes = 100},) catch |err| {
 | 
				
			||||||
 | 
							std.debug.print("Error executing `zig version`: {any}\n", .{err});
 | 
				
			||||||
 | 
							return ZimError.Unexpected;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    defer allocator.free(zig_ver_res.stdout);
 | 
				
			||||||
 | 
					    defer allocator.free(zig_ver_res.stderr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (zig_ver_res.term != .Exited) {
 | 
				
			||||||
 | 
					        std.debug.print("Expected `zig version` to exit, instead got {any}\n", .{zig_ver_res.term});
 | 
				
			||||||
 | 
					        return ZimError.Unexpected;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    const zig_ver = zig_ver_res.stdout[0..zig_ver_res.stdout.len - 1];
 | 
				
			||||||
 | 
					    std.debug.print("Opening zig-{s} std lib docs...\n", .{zig_ver});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var proc = std.ChildProcess.init(&.{ "firefox", std_path }, allocator);
 | 
				
			||||||
 | 
					    _ = proc.spawn() catch |err| {
 | 
				
			||||||
 | 
					        std.debug.print("Error while opening browser with local language reference\n{any}\n", .{err});
 | 
				
			||||||
 | 
					        return ZimError.Unexpected;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user