diff --git a/src/db.zig b/src/db.zig index 75eda51..3c4f6f0 100644 --- a/src/db.zig +++ b/src/db.zig @@ -1,3 +1,4 @@ +const std = @import("std"); const root = @import("root"); const Uuid = root.util.Uuid; @@ -9,6 +10,36 @@ pub const Actor = struct { bio: ?[]const u8 = null, }; +pub const Note = struct { + id: Uuid, + author: Uuid, + content: []const u8 = "", +}; + +pub fn CreateInfo(comptime T: type) type { + if (@typeInfo(T) != .Struct) @compileError("type is not struct"); + if (!std.meta.trait.hasField("id")(T)) @compileError("type does not have id field"); + if (@typeInfo(T).Struct.is_tuple) @compileError("type cannot be tuple"); + + var fields: [std.meta.fields(T).len - 1]std.builtin.TypeInfo.StructField = undefined; + var i = 0; + + for (std.meta.fields(T)) |field| { + if (std.mem.eql(u8, field.name, "id")) continue; + fields[i] = field; + i += 1; + } + + return @Type(.{ + .Struct = .{ + .layout = @typeInfo(T).Struct.layout, + .fields = &fields, + .is_tuple = false, + .decls = &[_]std.builtin.TypeInfo.Declaration{}, + }, + }); +} + const this_host = "localhost:8080"; const actor = Actor{ @@ -22,3 +53,7 @@ pub fn getActorById(id: Uuid) !?Actor { return null; } + +pub fn createNote(_: CreateInfo(Note)) !Uuid { + return try Uuid.parse("f75f5160-12d3-42c2-a81d-ad2245b7a74b"); +} diff --git a/src/main.zig b/src/main.zig index 626a750..48b6bb4 100644 --- a/src/main.zig +++ b/src/main.zig @@ -15,11 +15,20 @@ pub const routes = [_]Route{ Route.from(.GET, "/", staticString("Index Page")), Route.from(.GET, "/abc", staticString("abc")), Route.from(.GET, "/user/:id", getUser), + Route.from(.POST, "/note/", postNote), }; const this_scheme = "http"; const this_host = "localhost:8080"; +fn postNote(ctx: *http.Context, _: *const Route) anyerror!void { + _ = try db.createNote(.{ + .author = try Uuid.parse("f75f5160-12d3-42c2-a81d-ad2245b7a74b"), + .content = "test post", + }); + try ctx.response.statusOnly(200); +} + fn getUser(ctx: *http.Context, route: *const Route) anyerror!void { const id_str = route.arg("id", ctx.request.path);