diff options
| -rw-r--r-- | src/main.zig | 80 | 
1 files changed, 25 insertions, 55 deletions
diff --git a/src/main.zig b/src/main.zig index f0c1731..e7df07d 100644 --- a/src/main.zig +++ b/src/main.zig @@ -9,33 +9,30 @@ const SaprusPacketType = enum(u16) {      file_transfer = 0x8888,  }; -const SaprusHeaderFrame = struct { -    msg_type: SaprusPacketType, -    payload: []u8, +const SaprusMessage = union(SaprusPacketType) { +    relay: struct { +        dest: [4]u8, +        payload: []u8, +    }, +    file_transfer: void, // unimplemented      const Self = @This();      fn toBytes(s: Self, allocator: Allocator) ![]u8 { -        const buf = try allocator.alloc(u8, 4 + s.payload.len); -        std.mem.writeInt(u16, buf[0..2], @intFromEnum(s.msg_type), .big); -        std.mem.writeInt(u16, buf[2..4], @intCast(s.payload.len), .big); -        std.mem.copyForwards(u8, buf[4..], s.payload); -        return buf; -    } -}; - -const SaprusRelayMessage = struct { -    dest: [4]u8, -    payload: []u8, - -    const Self = @This(); +        var buf = std.ArrayList(u8).init(allocator); +        const w = buf.writer(); +        try w.writeInt(u16, @intFromEnum(@as(SaprusPacketType, s)), .big); + +        switch (s) { +            .relay => |relay| { +                try w.writeAll(&relay.dest); +                try w.writeInt(u16, @intCast(relay.payload.len), .big); +                try w.writeAll(relay.payload); +            }, +            .file_transfer => unreachable, +        } -    fn toBytes(s: Self, allocator: Allocator) ![]u8 { -        const buf = try allocator.alloc(u8, 4 + s.payload.len); -        std.mem.copyForwards(u8, buf[0..4], &s.dest); -        std.mem.copyForwards(u8, buf[4..], s.payload); -        std.debug.print("in tobytes {x}\n", .{buf}); -        return buf; +        return buf.toOwnedSlice();      }  }; @@ -48,22 +45,13 @@ pub fn main() !void {      var allocator = if (dba) |*d| d.allocator() else std.heap.smp_allocator; -    const str_msg = "Hello darkness my old friend"; -    var payload_bytes: [str_msg.len + 1]u8 = @splat(0); -    // const payload_bytes = try allocator.alloc(u8, str_msg.len); -    // defer allocator.free(payload_bytes); -    // std.mem.copyForwards(u8, payload_bytes[0..], str_msg); -    std.mem.copyBackwards(u8, payload_bytes[0..], str_msg); -    const relay: SaprusRelayMessage = .{ -        .dest = [_]u8{ 255, 255, 255, 255 }, -        .payload = payload_bytes[0..str_msg.len], -    }; -    const relay_bytes = try relay.toBytes(allocator); -    defer allocator.free(relay_bytes); -    const msg: SaprusHeaderFrame = .{ -        .msg_type = .relay, -        .payload = relay_bytes, +    const msg = SaprusMessage{ +        .relay = .{ +            .dest = .{ 255, 255, 255, 255 }, +            .payload = @ptrCast(@constCast("Hello darkness my old friend")), +        },      }; +      const msg_bytes = try msg.toBytes(allocator);      defer allocator.free(msg_bytes); @@ -88,25 +76,7 @@ pub fn main() !void {      try sock.bind(bind_addr); -    // std.debug.print("relay: {x}\n", .{relay_bytes}); -    std.debug.print("message bytes: {x}\n", .{msg_bytes}); - -    // @breakpoint();      _ = try sock.sendTo(dest_addr, msg_bytes); - -    // // Prints to stderr (it's a shortcut based on `std.io.getStdErr()`) -    // std.debug.print("All your {any} are belong to us.\n", .{msg}); - -    // // stdout is for the actual output of your application, for example if you -    // // are implementing gzip, then only the compressed bytes should be sent to -    // // stdout, not any debugging messages. -    // const stdout_file = std.io.getStdOut().writer(); -    // var bw = std.io.bufferedWriter(stdout_file); -    // const stdout = bw.writer(); - -    // try stdout.print("Run `zig build test` to run the tests.\n", .{}); - -    // try bw.flush(); // Don't forget to flush!  }  test "simple test" {  | 
