-- Leo's gemini proxy

-- Connecting to git.thebackupbox.net:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

repo: hackvr-turbo
action: commit
revision:
path_from:
revision_from: e51ab0742d28ed52f5a8716f4bf5f38c8371b7f5:
path_to:
revision_to:

git.thebackupbox.net

hackvr-turbo

git://git.thebackupbox.net/hackvr-turbo

commit e51ab0742d28ed52f5a8716f4bf5f38c8371b7f5
Author: Felix (xq) Queißner <git@mq32.de>
Date:   Thu Jun 25 20:24:47 2020 +0200

    More event parsing.

diff --git a/lib/hackvr/parser.zig b/lib/hackvr/parser.zig

index d9c5484e7f252cd4e06db908afede5d5e4fe0839..

index ..ed22d115e485e9f2830be7978df0c88a3ab57d94 100644

--- a/lib/hackvr/parser.zig
+++ b/lib/hackvr/parser.zig
@@ -49,21 +49,91 @@ pub const Parser = struct {
             0 => return null,
             1 => {
                 if (std.mem.eql(u8, "help", items.buffer[0])) {
-                    return Event{
-                        .event_type = .help,
-                    };
+                    return Event{ .help = {} };
                 } else if (std.mem.eql(u8, "version", items.buffer[0])) {
-                    return Event{
-                        .event_type = .version,
-                    };
+                    return Event{ .version = {} };
                 } else {
                     return error.UnknownCommand;
                 }
             },
             else => {
-                return Event{
-                    .event_type = .not_implemented_yet,
+                const selector = Selector{
+                    .groups = items.buffer[0],
                 };
+                const cmd = items.buffer[1];
+                const args = items.span()[2..];
+
+                if (std.mem.eql(u8, cmd, "status")) {
+                    return Event{ .status = selector };
+                } else if (std.mem.eql(u8, cmd, "dump")) {
+                    return Event{ .dump = selector };
+                } else if (std.mem.eql(u8, cmd, "quit")) {
+                    return Event{ .quit = selector };
+                } else if (std.mem.eql(u8, cmd, "set")) {
+                    return Event{ .set = selector };
+                } else if (std.mem.eql(u8, cmd, "physics")) {
+                    return Event{ .physics = selector };
+                } else if (std.mem.eql(u8, cmd, "periodic")) {
+                    return Event{ .periodic = selector };
+                } else if (std.mem.eql(u8, cmd, "flatten")) {
+                    return Event{ .flatten = selector };
+                } else if (std.mem.eql(u8, cmd, "deleteallexcept")) {
+                    if (args.len != 1)
+                        return error.ArgumentMismatch;
+                    return Event{
+                        .delete_all_except = GroupArgSelector{
+                            .selector = selector,
+                            .groups = args[0],
+                        },
+                    };
+                } else if (std.mem.eql(u8, cmd, "deletegroup")) {
+                    if (args.len != 1)
+                        return error.ArgumentMismatch;
+                    return Event{
+                        .delete_group = GroupArgSelector{
+                            .selector = selector,
+                            .groups = args[0],
+                        },
+                    };
+                } else if (std.mem.eql(u8, cmd, "assimilate")) {
+                    if (args.len != 1)
+                        return error.ArgumentMismatch;
+                    return Event{
+                        .assimilate = GroupArgSelector{
+                            .selector = selector,
+                            .groups = args[0],
+                        },
+                    };
+                } else if (std.mem.eql(u8, cmd, "renamegroup")) {
+                    if (args.len != 1)
+                        return error.ArgumentMismatch;
+                    return Event{
+                        .rename_group = GroupArgSelector{
+                            .selector = selector,
+                            .groups = args[0],
+                        },
+                    };
+                } else if (std.mem.eql(u8, cmd, "export")) {
+                    if (args.len != 1)
+                        return error.ArgumentMismatch;
+                    return Event{
+                        .@"export" = GroupArgSelector{
+                            .selector = selector,
+                            .groups = args[0],
+                        },
+                    };
+                } else if (std.mem.eql(u8, cmd, "control")) {
+                    if (args.len != 1)
+                        return error.ArgumentMismatch;
+                    return Event{
+                        .control = GroupArgSelector{
+                            .selector = selector,
+                            .groups = args[0],
+                        },
+                    };
+                }
+
+                return error.UnknownCommand;
             },
         }
     }
@@ -156,15 +226,59 @@ pub const PushResult = union(enum) {
     },
 };

-pub const Event = struct {
-    const Type = enum {
-        help,
-        version,
+pub const EventType = enum {
+    help,
+    version,
+    status,
+    dump,
+    quit,
+    set,
+    physics,
+    control,
+    addshape,
+    @"export",
+    ping,
+    scale,
+    rotate,
+    periodic,
+    flatten,
+    move,
+    delete_group,
+    assimilate,
+    rename_group,
+    delete_all_except,
+};

-        not_implemented_yet,
-    };
+pub const Selector = struct {
+    groups: []const u8,
+};
+
+pub const GroupArgSelector = struct {
+    selector: Selector,
+    groups: []const u8,
+};

-    event_type: Type,
+pub const Event = union(EventType) {
+    delete_group: GroupArgSelector,
+    assimilate: GroupArgSelector,
+    rename_group: GroupArgSelector,
+    delete_all_except: GroupArgSelector,
+    help,
+    version,
+    status: Selector,
+    dump: Selector,
+    quit: Selector,
+    set: Selector,
+    physics: Selector,
+    control: GroupArgSelector,
+    addshape,
+    @"export": GroupArgSelector,
+    ping,
+    scale,
+    rotate,
+    periodic: Selector,
+    flatten: Selector,
+    move,
 };

 test "parser: invalid encoding" {
@@ -209,15 +323,109 @@ test "parser: ParseResult.rest/event" {
 }

 test "parser: parse line" {
-    _ = try Parser.parseLine("  a bb cccc ");
+    _ = Parser.parseLine("  a bb cccc ") catch |err| {
+        std.testing.expect(err == error.UnknownCommand);
+        return;
+    };
+    unreachable;
 }

 test "parser: cmd help" {
     const result = (try Parser.parseLine("help")) orelse return error.ExpectedEvent;
-    std.testing.expect(result.event_type == .help);
+    std.testing.expect(result == .help);
 }

 test "parser: cmd version" {
     const result = (try Parser.parseLine("version")) orelse return error.ExpectedEvent;
-    std.testing.expect(result.event_type == .version);
+    std.testing.expect(result == .version);
+}
+
+test "parser: cmd status" {
+    const result = (try Parser.parseLine("foobar status")) orelse return error.ExpectedEvent;
+    std.testing.expect(result == .status);
+    std.testing.expectEqualStrings("foobar", result.status.groups);
+}
+
+test "parser: cmd dump" {
+    const result = (try Parser.parseLine("foobar dump")) orelse return error.ExpectedEvent;
+    std.testing.expect(result == .dump);
+    std.testing.expectEqualStrings("foobar", result.dump.groups);
+}
+
+test "parser: cmd quit" {
+    const result = (try Parser.parseLine("foobar quit")) orelse return error.ExpectedEvent;
+    std.testing.expect(result == .quit);
+    std.testing.expectEqualStrings("foobar", result.quit.groups);
+}
+
+test "parser: cmd set" {
+    const result = (try Parser.parseLine("foobar set")) orelse return error.ExpectedEvent;
+    std.testing.expect(result == .set);
+    std.testing.expectEqualStrings("foobar", result.set.groups);
+}
+
+test "parser: cmd physics" {
+    const result = (try Parser.parseLine("foobar physics")) orelse return error.ExpectedEvent;
+    std.testing.expect(result == .physics);
+    std.testing.expectEqualStrings("foobar", result.physics.groups);
+}
+
+test "parser: cmd periodic" {
+    const result = (try Parser.parseLine("foobar periodic")) orelse return error.ExpectedEvent;
+    std.testing.expect(result == .periodic);
+    std.testing.expectEqualStrings("foobar", result.periodic.groups);
+}
+
+test "parser: cmd flatten" {
+    const result = (try Parser.parseLine("foobar flatten")) orelse return error.ExpectedEvent;
+    std.testing.expect(result == .flatten);
+    std.testing.expectEqualStrings("foobar", result.flatten.groups);
+}
+
+test "parser: cmd deleteallexcept" {
+    const result = (try Parser.parseLine("foobar deleteallexcept groupsel")) orelse return error.ExpectedEvent;
+
+    std.testing.expect(result == .delete_all_except);
+    std.testing.expectEqualStrings("foobar", result.delete_all_except.selector.groups);
+    std.testing.expectEqualStrings("groupsel", result.delete_all_except.groups);
+}
+
+test "parser: cmd delete_group" {
+    const result = (try Parser.parseLine("foobar deletegroup groupsel")) orelse return error.ExpectedEvent;
+
+    std.testing.expect(result == .delete_group);
+    std.testing.expectEqualStrings("foobar", result.delete_group.selector.groups);
+    std.testing.expectEqualStrings("groupsel", result.delete_group.groups);
+}
+
+test "parser: cmd delete_group" {
+    const result = (try Parser.parseLine("foobar renamegroup groupsel")) orelse return error.ExpectedEvent;
+
+    std.testing.expect(result == .rename_group);
+    std.testing.expectEqualStrings("foobar", result.rename_group.selector.groups);
+    std.testing.expectEqualStrings("groupsel", result.rename_group.groups);
+}
+
+test "parser: cmd delete_group" {
+    const result = (try Parser.parseLine("foobar assimilate groupsel")) orelse return error.ExpectedEvent;
+
+    std.testing.expect(result == .assimilate);
+    std.testing.expectEqualStrings("foobar", result.assimilate.selector.groups);
+    std.testing.expectEqualStrings("groupsel", result.assimilate.groups);
+}
+
+test "parser: cmd control" {
+    const result = (try Parser.parseLine("foobar control groupsel")) orelse return error.ExpectedEvent;
+
+    std.testing.expect(result == .control);
+    std.testing.expectEqualStrings("foobar", result.control.selector.groups);
+    std.testing.expectEqualStrings("groupsel", result.control.groups);
+}
+
+test "parser: cmd export" {
+    const result = (try Parser.parseLine("foobar export groupsel")) orelse return error.ExpectedEvent;
+
+    std.testing.expect(result == .@"export");
+    std.testing.expectEqualStrings("foobar", result.@"export".selector.groups);
+    std.testing.expectEqualStrings("groupsel", result.@"export".groups);
 }

-----END OF PAGE-----

-- Response ended

-- Page fetched on Sun Jun 2 18:30:54 2024