Remove zinput dependency
This commit is contained in:
parent
e320dbd651
commit
ebc6de9673
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,6 +1,3 @@
|
|||||||
[submodule "src/known-folders"]
|
[submodule "src/known-folders"]
|
||||||
path = src/known-folders
|
path = src/known-folders
|
||||||
url = https://github.com/ziglibs/known-folders
|
url = https://github.com/ziglibs/known-folders
|
||||||
[submodule "src/zinput"]
|
|
||||||
path = src/zinput
|
|
||||||
url = https://github.com/ziglibs/zinput
|
|
||||||
|
@ -23,7 +23,6 @@ pub fn build(b: *std.build.Builder) !void {
|
|||||||
);
|
);
|
||||||
|
|
||||||
exe.addPackage(.{ .name = "known-folders", .source = .{ .path = "src/known-folders/known-folders.zig" } });
|
exe.addPackage(.{ .name = "known-folders", .source = .{ .path = "src/known-folders/known-folders.zig" } });
|
||||||
exe.addPackage(.{ .name = "zinput", .source = .{ .path = "src/zinput/src/main.zig" } });
|
|
||||||
|
|
||||||
exe.setTarget(target);
|
exe.setTarget(target);
|
||||||
exe.setBuildMode(mode);
|
exe.setBuildMode(mode);
|
||||||
|
105
src/setup.zig
105
src/setup.zig
@ -1,8 +1,95 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const builtin = @import("builtin");
|
const builtin = @import("builtin");
|
||||||
const zinput = @import("zinput");
|
|
||||||
const known_folders = @import("known-folders");
|
const known_folders = @import("known-folders");
|
||||||
|
|
||||||
|
/// Caller must free memory.
|
||||||
|
pub fn askString(allocator: std.mem.Allocator, prompt: []const u8, max_size: usize) ![]u8 {
|
||||||
|
const in = std.io.getStdIn().reader();
|
||||||
|
const out = std.io.getStdOut().writer();
|
||||||
|
|
||||||
|
try out.print("? {s}", .{prompt});
|
||||||
|
|
||||||
|
const result = try in.readUntilDelimiterAlloc(allocator, '\n', max_size);
|
||||||
|
return if (std.mem.endsWith(u8, result, "\r")) result[0..(result.len - 1)] else result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Caller must free memory. Max size is recommended to be a high value, like 512.
|
||||||
|
pub fn askDirPath(allocator: std.mem.Allocator, prompt: []const u8, max_size: usize) ![]u8 {
|
||||||
|
const out = std.io.getStdOut().writer();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
const path = try askString(allocator, prompt, max_size);
|
||||||
|
if (!std.fs.path.isAbsolute(path)) {
|
||||||
|
try out.writeAll("Error: Invalid directory, please try again.\n\n");
|
||||||
|
allocator.free(path);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var dir = std.fs.cwd().openDir(path, std.fs.Dir.OpenDirOptions{}) catch {
|
||||||
|
try out.writeAll("Error: Invalid directory, please try again.\n\n");
|
||||||
|
allocator.free(path);
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
|
||||||
|
dir.close();
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn askBool(prompt: []const u8) !bool {
|
||||||
|
const in = std.io.getStdIn().reader();
|
||||||
|
const out = std.io.getStdOut().writer();
|
||||||
|
|
||||||
|
var buffer: [1]u8 = undefined;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
try out.print("? {s} (y/n) > ", .{prompt});
|
||||||
|
|
||||||
|
const read = in.read(&buffer) catch continue;
|
||||||
|
try in.skipUntilDelimiterOrEof('\n');
|
||||||
|
|
||||||
|
if (read == 0) return error.EndOfStream;
|
||||||
|
|
||||||
|
switch (buffer[0]) {
|
||||||
|
'y' => return true,
|
||||||
|
'n' => return false,
|
||||||
|
else => continue,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn askSelectOne(prompt: []const u8, comptime Options: type) !Options {
|
||||||
|
const in = std.io.getStdIn().reader();
|
||||||
|
const out = std.io.getStdOut().writer();
|
||||||
|
|
||||||
|
try out.print("? {s} (select one)\n\n", .{prompt});
|
||||||
|
|
||||||
|
comptime var max_size: usize = 0;
|
||||||
|
inline for (@typeInfo(Options).Enum.fields) |option| {
|
||||||
|
try out.print(" - {s}\n", .{option.name});
|
||||||
|
if (option.name.len > max_size) max_size = option.name.len;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
var buffer: [max_size + 1]u8 = undefined;
|
||||||
|
|
||||||
|
try out.writeAll("\n> ");
|
||||||
|
|
||||||
|
var result = (in.readUntilDelimiterOrEof(&buffer, '\n') catch {
|
||||||
|
try in.skipUntilDelimiterOrEof('\n');
|
||||||
|
try out.writeAll("Error: Invalid option, please try again.\n");
|
||||||
|
continue;
|
||||||
|
}) orelse return error.EndOfStream;
|
||||||
|
result = if (std.mem.endsWith(u8, result, "\r")) result[0..(result.len - 1)] else result;
|
||||||
|
|
||||||
|
inline for (@typeInfo(Options).Enum.fields) |option|
|
||||||
|
if (std.ascii.eqlIgnoreCase(option.name, result))
|
||||||
|
return @intToEnum(Options, option.value);
|
||||||
|
|
||||||
|
try out.writeAll("Error: Invalid option, please try again.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn print(comptime fmt: []const u8, args: anytype) void {
|
fn print(comptime fmt: []const u8, args: anytype) void {
|
||||||
const stdout = std.io.getStdOut().writer();
|
const stdout = std.io.getStdOut().writer();
|
||||||
stdout.print(fmt, args) catch @panic("Could not write to stdout");
|
stdout.print(fmt, args) catch @panic("Could not write to stdout");
|
||||||
@ -39,7 +126,7 @@ pub fn wizard(allocator: std.mem.Allocator) !void {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var config_path: []const u8 = undefined;
|
var config_path: []const u8 = undefined;
|
||||||
if (try zinput.askBool("Should this configuration be system-wide?")) {
|
if (try askBool("Should this configuration be system-wide?")) {
|
||||||
if (global_path) |p| {
|
if (global_path) |p| {
|
||||||
config_path = p;
|
config_path = p;
|
||||||
} else {
|
} else {
|
||||||
@ -73,7 +160,7 @@ pub fn wizard(allocator: std.mem.Allocator) !void {
|
|||||||
print("Found zig executable '{s}' in PATH.\n", .{path});
|
print("Found zig executable '{s}' in PATH.\n", .{path});
|
||||||
} else {
|
} else {
|
||||||
write("Could not find 'zig' in PATH\n");
|
write("Could not find 'zig' in PATH\n");
|
||||||
zig_exe_path = try zinput.askString(allocator, if (builtin.os.tag == .windows)
|
zig_exe_path = try askString(allocator, if (builtin.os.tag == .windows)
|
||||||
\\What is the path to the 'zig' executable you would like to use?
|
\\What is the path to the 'zig' executable you would like to use?
|
||||||
\\Note that due to a bug in zig (https://github.com/ziglang/zig/issues/6044),
|
\\Note that due to a bug in zig (https://github.com/ziglang/zig/issues/6044),
|
||||||
\\your zig directory cannot contain the '/' character.
|
\\your zig directory cannot contain the '/' character.
|
||||||
@ -81,15 +168,15 @@ pub fn wizard(allocator: std.mem.Allocator) !void {
|
|||||||
"What is the path to the 'zig' executable you would like to use?", std.fs.MAX_PATH_BYTES);
|
"What is the path to the 'zig' executable you would like to use?", std.fs.MAX_PATH_BYTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
const editor = try zinput.askSelectOne("Which code editor do you use?", enum { VSCode, Sublime, Kate, Neovim, Vim8, Emacs, Doom, Other });
|
const editor = try askSelectOne("Which code editor do you use?", enum { VSCode, Sublime, Kate, Neovim, Vim8, Emacs, Doom, Other });
|
||||||
const snippets = try zinput.askBool("Do you want to enable snippets?");
|
const snippets = try askBool("Do you want to enable snippets?");
|
||||||
const style = try zinput.askBool("Do you want to enable style warnings?");
|
const style = try askBool("Do you want to enable style warnings?");
|
||||||
const semantic_tokens = try zinput.askBool("Do you want to enable semantic highlighting?");
|
const semantic_tokens = try askBool("Do you want to enable semantic highlighting?");
|
||||||
const operator_completions = try zinput.askBool("Do you want to enable .* and .? completions?");
|
const operator_completions = try askBool("Do you want to enable .* and .? completions?");
|
||||||
const include_at_in_builtins = switch (editor) {
|
const include_at_in_builtins = switch (editor) {
|
||||||
.Sublime => true,
|
.Sublime => true,
|
||||||
.VSCode, .Kate, .Neovim, .Vim8, .Emacs, .Doom => false,
|
.VSCode, .Kate, .Neovim, .Vim8, .Emacs, .Doom => false,
|
||||||
else => try zinput.askBool("Should the @ sign be included in completions of builtin functions?\nChange this later if `@inc` completes to `include` or `@@include`"),
|
else => try askBool("Should the @ sign be included in completions of builtin functions?\nChange this later if `@inc` completes to `include` or `@@include`"),
|
||||||
};
|
};
|
||||||
const max_detail_length: usize = switch (editor) {
|
const max_detail_length: usize = switch (editor) {
|
||||||
.Sublime => 256,
|
.Sublime => 256,
|
||||||
|
@ -1 +0,0 @@
|
|||||||
Subproject commit 5e0d781eee025cfea271dd10c1939d201fe4fd25
|
|
Loading…
Reference in New Issue
Block a user