dotfiles/scripts/alecor/src/main.zig

74 lines
2.3 KiB
Zig

const std = @import("std");
const cache = @import("cache.zig");
const util = @import("util.zig");
pub const std_options = std.Options{
.log_level = .debug,
.logFn = @import("common").logFn,
};
pub fn main() !void {
if (std.os.argv.len < 2)
return error.NotEnoughArguments;
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const alloc = gpa.allocator();
const subcmd = std.mem.span(std.os.argv[1]);
if (std.mem.eql(u8, subcmd, "doalec")) {
if (std.os.argv.len < 3)
return error.NotEnoughArguments;
var args = std.ArrayList([]const u8).init(alloc);
defer args.deinit();
var spliter = std.mem.tokenize(u8, std.mem.span(std.os.argv[2]), "\n");
while (spliter.next()) |arg|
try args.append(arg);
// open and map cache
const cache_path = try cache.commandsCachePath(alloc);
defer alloc.free(cache_path);
var cache_file = try std.fs.cwd().openFile(cache_path, .{});
defer cache_file.close();
const cache_content = try std.os.mmap(
null,
(try cache_file.stat()).size,
std.os.PROT.READ,
.{ .TYPE = .PRIVATE },
cache_file.handle,
0,
);
defer std.os.munmap(cache_content);
var command_set = std.StringHashMap(void).init(alloc);
defer command_set.deinit();
var cache_tok = std.mem.tokenize(u8, cache_content, "\n");
while (cache_tok.next()) |tok|
if (tok.len != 0)
try command_set.put(tok, {});
var arena = std.heap.ArenaAllocator.init(alloc);
defer arena.deinit();
try @import("correct.zig").correctCommand(&arena, args.items, &command_set);
try std.io.getStdOut().writer().print("{}\n", .{util.fmtCommand(args.items)});
} else if (std.mem.eql(u8, subcmd, "printfish")) {
try std.io.getStdOut().writer().print(
\\function alec --description 'ALEC'
\\ commandline (builtin history search -n 1)
\\ commandline ({s} doalec (commandline -o | string split0))
\\end
\\
, .{std.os.argv[0]});
} else if (std.mem.eql(u8, subcmd, "mkcache")) {
try cache.generate(alloc);
} else return error.UnknownCommand;
}