From 94877ef2f689617706a646cf0abda7dc25ceba88 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 17 Jan 2026 14:26:08 +0900 Subject: implement array index filter --- src/jq/tokenize.zig | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) (limited to 'src/jq/tokenize.zig') diff --git a/src/jq/tokenize.zig b/src/jq/tokenize.zig index 0823ea1..92f96ca 100644 --- a/src/jq/tokenize.zig +++ b/src/jq/tokenize.zig @@ -2,32 +2,56 @@ const std = @import("std"); pub const TokenizeError = error{ UnexpectedEnd, + InvalidCharacter, }; pub const TokenKind = enum { end, - identity, + dot, + bracket_left, + bracket_right, + number, }; -pub const Token = struct { - kind: TokenKind, +pub const Token = union(TokenKind) { + end, + dot, + bracket_left, + bracket_right, + number: i64, + + pub fn kind(self: @This()) TokenKind { + return self; + } }; pub fn tokenize(allocator: std.mem.Allocator, query: []const u8) ![]Token { var tokens = try std.array_list.Aligned(Token, null).initCapacity(allocator, 16); const len = query.len; + + if (len == 0) { + return error.UnexpectedEnd; + } + var i: usize = 0; while (i < len) { const c = query[i]; - if (c == '.') { - try tokens.append(allocator, .{ .kind = .identity }); - } else { - return TokenizeError.UnexpectedEnd; + switch (c) { + '.' => try tokens.append(allocator, .dot), + '[' => try tokens.append(allocator, .bracket_left), + ']' => try tokens.append(allocator, .bracket_right), + else => { + if (std.ascii.isDigit(c)) { + try tokens.append(allocator, .{ .number = (c - '0') }); + } else { + return error.InvalidCharacter; + } + }, } i += 1; } - try tokens.append(allocator, .{ .kind = .end }); + try tokens.append(allocator, .end); return tokens.toOwnedSlice(allocator); } -- cgit v1.3-1-g0d28