lib/xkb/src/keymap/text/compile.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const xkb = @import("../../root.zig");
3 const parse = @import("parse/root.zig");
4 const resolve = @import("resolve.zig");
5
6 pub const Error = parse.Error || resolve.Error;
7
8 pub const Compiled = struct {
9 arena: std.heap.ArenaAllocator,
10 value: *const xkb.keymap.Keymap,
11
12 pub fn keymap(self: *const Compiled) *const xkb.keymap.Keymap {
13 return self.value;
14 }
15
16 pub fn deinit(self: *Compiled) void {
17 self.arena.deinit();
18 self.* = undefined;
19 }
20 };
21
22 pub fn compile(allocator: std.mem.Allocator, input: []const u8) Error!Compiled {
23 var arena = std.heap.ArenaAllocator.init(allocator);
24 errdefer arena.deinit();
25 const arena_allocator = arena.allocator();
26 const parsed_document = try parse.parse(arena_allocator, input);
27 const value = try resolve.resolve(arena_allocator, parsed_document);
28 return .{ .arena = arena, .value = value };
29 }