Finish using middleware impl
This commit is contained in:
parent
9c5e46ec5a
commit
856619b286
11 changed files with 31 additions and 81 deletions
|
@ -5,48 +5,6 @@ const http = @import("./lib.zig");
|
||||||
const util = @import("util");
|
const util = @import("util");
|
||||||
const query_utils = @import("./query.zig");
|
const query_utils = @import("./query.zig");
|
||||||
const json_utils = @import("./json.zig");
|
const json_utils = @import("./json.zig");
|
||||||
//const json_utils = util;
|
|
||||||
//const query_utils = util;
|
|
||||||
|
|
||||||
fn printFields(comptime fields: []const std.builtin.Type.StructField) void {
|
|
||||||
comptime {
|
|
||||||
inline for (fields) |f| @compileLog(f.name.ptr, f.field_type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn AddFields(comptime lhs: type, comptime rhs: type) type {
|
|
||||||
const fields = std.meta.fields(lhs) ++ std.meta.fields(rhs);
|
|
||||||
comptime if (false) {
|
|
||||||
@compileLog("New Type");
|
|
||||||
@compileLog("lhs");
|
|
||||||
printFields(std.meta.fields(lhs));
|
|
||||||
@compileLog("rhs");
|
|
||||||
printFields(std.meta.fields(rhs));
|
|
||||||
@compileLog("all");
|
|
||||||
printFields(fields);
|
|
||||||
};
|
|
||||||
const Ctx = @Type(.{ .Struct = .{
|
|
||||||
.layout = .Auto,
|
|
||||||
.fields = fields,
|
|
||||||
.decls = &.{},
|
|
||||||
.is_tuple = false,
|
|
||||||
} });
|
|
||||||
return Ctx;
|
|
||||||
// return struct {
|
|
||||||
// path: []const u8,
|
|
||||||
// fragment: []const u8,
|
|
||||||
// query_string: []const u8,
|
|
||||||
// api_source: *anyopaque,
|
|
||||||
// };
|
|
||||||
}
|
|
||||||
|
|
||||||
fn addFields(lhs: anytype, rhs: anytype) AddFields(@TypeOf(lhs), @TypeOf(rhs)) {
|
|
||||||
var result: AddFields(@TypeOf(lhs), @TypeOf(rhs)) = undefined;
|
|
||||||
inline for (comptime std.meta.fieldNames(@TypeOf(lhs))) |f| @field(result, f) = @field(lhs, f);
|
|
||||||
inline for (comptime std.meta.fieldNames(@TypeOf(rhs))) |f| @field(result, f) = @field(rhs, f);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn AddUniqueField(comptime Lhs: type, comptime N: usize, comptime name: [N]u8, comptime Val: type) type {
|
fn AddUniqueField(comptime Lhs: type, comptime N: usize, comptime name: [N]u8, comptime Val: type) type {
|
||||||
const Ctx = @Type(.{ .Struct = .{
|
const Ctx = @Type(.{ .Struct = .{
|
||||||
.layout = .Auto,
|
.layout = .Auto,
|
||||||
|
@ -114,15 +72,6 @@ pub fn Apply(comptime Middlewares: type) type {
|
||||||
return ApplyInternal(std.meta.fields(Middlewares));
|
return ApplyInternal(std.meta.fields(Middlewares));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn InjectContext(comptime Values: type) type {
|
|
||||||
return struct {
|
|
||||||
values: Values,
|
|
||||||
pub fn handle(self: @This(), req: anytype, res: anytype, ctx: anytype, next: anytype) !void {
|
|
||||||
return next.handle(req, res, addFields(ctx, self.values), {});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn InjectContextValue(comptime name: []const u8, comptime V: type) type {
|
pub fn InjectContextValue(comptime name: []const u8, comptime V: type) type {
|
||||||
return struct {
|
return struct {
|
||||||
val: V,
|
val: V,
|
||||||
|
@ -131,9 +80,6 @@ pub fn InjectContextValue(comptime name: []const u8, comptime V: type) type {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
pub fn injectContext(values: anytype) InjectContext(@TypeOf(values)) {
|
|
||||||
return .{ .values = values };
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn injectContextValue(comptime name: []const u8, val: anytype) InjectContextValue(name, @TypeOf(val)) {
|
pub fn injectContextValue(comptime name: []const u8, val: anytype) InjectContextValue(name, @TypeOf(val)) {
|
||||||
return .{ .val = val };
|
return .{ .val = val };
|
||||||
|
@ -165,7 +111,7 @@ pub fn CatchErrors(comptime ErrorHandler: type) type {
|
||||||
return self.error_handler.handle(
|
return self.error_handler.handle(
|
||||||
req,
|
req,
|
||||||
res,
|
res,
|
||||||
addFields(ctx, .{ .err = err }),
|
addField(ctx, "err", err),
|
||||||
next,
|
next,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -205,16 +151,20 @@ pub const split_uri = struct {
|
||||||
const path = query_split.first();
|
const path = query_split.first();
|
||||||
const query = query_split.rest();
|
const query = query_split.rest();
|
||||||
|
|
||||||
const added_ctx = .{
|
const new_ctx = addField(
|
||||||
.path = path,
|
addField(
|
||||||
.query_string = query,
|
addField(ctx, "path", path),
|
||||||
.fragment_string = fragment,
|
"query_string",
|
||||||
};
|
query,
|
||||||
|
),
|
||||||
|
"fragment_string",
|
||||||
|
fragment,
|
||||||
|
);
|
||||||
|
|
||||||
return next.handle(
|
return next.handle(
|
||||||
req,
|
req,
|
||||||
res,
|
res,
|
||||||
addFields(ctx, added_ctx),
|
new_ctx,
|
||||||
{},
|
{},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -282,6 +232,7 @@ pub const Route = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle(self: @This(), req: anytype, res: anytype, ctx: anytype, next: anytype) !void {
|
pub fn handle(self: @This(), req: anytype, res: anytype, ctx: anytype, next: anytype) !void {
|
||||||
|
std.log.debug("Testing path {s} against {s}", .{ ctx.path, self.desc.path });
|
||||||
return if (self.applies(req, ctx))
|
return if (self.applies(req, ctx))
|
||||||
next.handle(req, res, ctx, {})
|
next.handle(req, res, ctx, {})
|
||||||
else
|
else
|
||||||
|
|
|
@ -10,7 +10,7 @@ pub const Response = struct {
|
||||||
alloc: std.mem.Allocator,
|
alloc: std.mem.Allocator,
|
||||||
stream: Stream,
|
stream: Stream,
|
||||||
should_close: bool = false,
|
should_close: bool = false,
|
||||||
was_opened: bool = true,
|
was_opened: bool = false,
|
||||||
|
|
||||||
pub const ResponseStream = response.ResponseStream(Stream.Writer);
|
pub const ResponseStream = response.ResponseStream(Stream.Writer);
|
||||||
pub fn open(self: *Response, status: http.Status, headers: *const http.Fields) !ResponseStream {
|
pub fn open(self: *Response, status: http.Status, headers: *const http.Fields) !ResponseStream {
|
||||||
|
@ -126,6 +126,7 @@ pub const Server = struct {
|
||||||
initial_context: anytype,
|
initial_context: anytype,
|
||||||
handler: anytype,
|
handler: anytype,
|
||||||
) void {
|
) void {
|
||||||
|
defer conn.stream.close();
|
||||||
while (true) {
|
while (true) {
|
||||||
var req = request.parse(allocator, conn.stream.reader()) catch |err| {
|
var req = request.parse(allocator, conn.stream.reader()) catch |err| {
|
||||||
const status: http.Status = switch (err) {
|
const status: http.Status = switch (err) {
|
||||||
|
|
|
@ -157,10 +157,8 @@ const api_router = mdw.apply(.{
|
||||||
|
|
||||||
pub const router = mdw.apply(.{
|
pub const router = mdw.apply(.{
|
||||||
mdw.split_uri,
|
mdw.split_uri,
|
||||||
//mdw.catchErrors(mdw.default_error_handler),
|
mdw.catchErrors(mdw.default_error_handler),
|
||||||
mdw.router(.{api_router} ++ web_endpoints),
|
mdw.router(.{api_router} ++ web_endpoints),
|
||||||
//mdw.router(web_endpoints),
|
|
||||||
//api_router,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
pub const AllocationStrategy = enum {
|
pub const AllocationStrategy = enum {
|
||||||
|
|
|
@ -3,7 +3,7 @@ const std = @import("std");
|
||||||
|
|
||||||
pub const login = struct {
|
pub const login = struct {
|
||||||
pub const method = .POST;
|
pub const method = .POST;
|
||||||
pub const path = "/api/v0/auth/login";
|
pub const path = "/auth/login";
|
||||||
|
|
||||||
pub const Body = struct {
|
pub const Body = struct {
|
||||||
username: []const u8,
|
username: []const u8,
|
||||||
|
@ -21,7 +21,7 @@ pub const login = struct {
|
||||||
|
|
||||||
pub const verify_login = struct {
|
pub const verify_login = struct {
|
||||||
pub const method = .GET;
|
pub const method = .GET;
|
||||||
pub const path = "/api/v0/auth/login";
|
pub const path = "/auth/login";
|
||||||
|
|
||||||
pub fn handler(_: anytype, res: anytype, srv: anytype) !void {
|
pub fn handler(_: anytype, res: anytype, srv: anytype) !void {
|
||||||
const info = try srv.verifyAuthorization();
|
const info = try srv.verifyAuthorization();
|
||||||
|
|
|
@ -5,7 +5,7 @@ const QueryArgs = api.CommunityQueryArgs;
|
||||||
|
|
||||||
pub const create = struct {
|
pub const create = struct {
|
||||||
pub const method = .POST;
|
pub const method = .POST;
|
||||||
pub const path = "/api/v0/communities";
|
pub const path = "/communities";
|
||||||
|
|
||||||
pub const Body = struct {
|
pub const Body = struct {
|
||||||
origin: []const u8,
|
origin: []const u8,
|
||||||
|
@ -20,7 +20,7 @@ pub const create = struct {
|
||||||
|
|
||||||
pub const query = struct {
|
pub const query = struct {
|
||||||
pub const method = .GET;
|
pub const method = .GET;
|
||||||
pub const path = "/api/v0/communities";
|
pub const path = "/communities";
|
||||||
|
|
||||||
pub const Query = QueryArgs;
|
pub const Query = QueryArgs;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ const api = @import("api");
|
||||||
|
|
||||||
pub const create = struct {
|
pub const create = struct {
|
||||||
pub const method = .POST;
|
pub const method = .POST;
|
||||||
pub const path = "/api/v0/invites";
|
pub const path = "/invites";
|
||||||
|
|
||||||
pub const Body = api.InviteOptions;
|
pub const Body = api.InviteOptions;
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ const util = @import("util");
|
||||||
|
|
||||||
pub const create = struct {
|
pub const create = struct {
|
||||||
pub const method = .POST;
|
pub const method = .POST;
|
||||||
pub const path = "/api/v0/notes";
|
pub const path = "/notes";
|
||||||
|
|
||||||
pub const Body = struct {
|
pub const Body = struct {
|
||||||
content: []const u8,
|
content: []const u8,
|
||||||
|
@ -18,7 +18,7 @@ pub const create = struct {
|
||||||
|
|
||||||
pub const get = struct {
|
pub const get = struct {
|
||||||
pub const method = .GET;
|
pub const method = .GET;
|
||||||
pub const path = "/api/v0/notes/:id";
|
pub const path = "/notes/:id";
|
||||||
|
|
||||||
pub const Args = struct {
|
pub const Args = struct {
|
||||||
id: util.Uuid,
|
id: util.Uuid,
|
||||||
|
|
|
@ -3,7 +3,7 @@ const std = @import("std");
|
||||||
|
|
||||||
pub const streaming = struct {
|
pub const streaming = struct {
|
||||||
pub const method = .GET;
|
pub const method = .GET;
|
||||||
pub const path = "/api/v0/streaming";
|
pub const path = "/streaming";
|
||||||
|
|
||||||
pub fn handler(req: anytype, response: anytype, _: anytype) !void {
|
pub fn handler(req: anytype, response: anytype, _: anytype) !void {
|
||||||
var iter = req.headers.iterator();
|
var iter = req.headers.iterator();
|
||||||
|
|
|
@ -4,7 +4,7 @@ const controller_utils = @import("../../controllers.zig").helpers;
|
||||||
|
|
||||||
pub const global = struct {
|
pub const global = struct {
|
||||||
pub const method = .GET;
|
pub const method = .GET;
|
||||||
pub const path = "/api/v0/timelines/global";
|
pub const path = "/timelines/global";
|
||||||
|
|
||||||
pub const Query = api.TimelineArgs;
|
pub const Query = api.TimelineArgs;
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ pub const global = struct {
|
||||||
|
|
||||||
pub const local = struct {
|
pub const local = struct {
|
||||||
pub const method = .GET;
|
pub const method = .GET;
|
||||||
pub const path = "/api/v0/timelines/local";
|
pub const path = "/timelines/local";
|
||||||
|
|
||||||
pub const Query = api.TimelineArgs;
|
pub const Query = api.TimelineArgs;
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ pub const local = struct {
|
||||||
|
|
||||||
pub const home = struct {
|
pub const home = struct {
|
||||||
pub const method = .GET;
|
pub const method = .GET;
|
||||||
pub const path = "/api/v0/timelines/home";
|
pub const path = "/timelines/home";
|
||||||
|
|
||||||
pub const Query = api.TimelineArgs;
|
pub const Query = api.TimelineArgs;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ const api = @import("api");
|
||||||
|
|
||||||
pub const create = struct {
|
pub const create = struct {
|
||||||
pub const method = .POST;
|
pub const method = .POST;
|
||||||
pub const path = "/api/v0/users";
|
pub const path = "/users";
|
||||||
|
|
||||||
pub const Body = struct {
|
pub const Body = struct {
|
||||||
username: []const u8,
|
username: []const u8,
|
||||||
|
|
|
@ -6,7 +6,7 @@ const Uuid = util.Uuid;
|
||||||
|
|
||||||
pub const create = struct {
|
pub const create = struct {
|
||||||
pub const method = .POST;
|
pub const method = .POST;
|
||||||
pub const path = "/api/v0/users/:id/follow";
|
pub const path = "/users/:id/follow";
|
||||||
|
|
||||||
pub const Args = struct {
|
pub const Args = struct {
|
||||||
id: Uuid,
|
id: Uuid,
|
||||||
|
@ -21,7 +21,7 @@ pub const create = struct {
|
||||||
|
|
||||||
pub const delete = struct {
|
pub const delete = struct {
|
||||||
pub const method = .DELETE;
|
pub const method = .DELETE;
|
||||||
pub const path = "/api/v0/users/:id/follow";
|
pub const path = "/users/:id/follow";
|
||||||
|
|
||||||
pub const Args = struct {
|
pub const Args = struct {
|
||||||
id: Uuid,
|
id: Uuid,
|
||||||
|
@ -36,7 +36,7 @@ pub const delete = struct {
|
||||||
|
|
||||||
pub const query_followers = struct {
|
pub const query_followers = struct {
|
||||||
pub const method = .GET;
|
pub const method = .GET;
|
||||||
pub const path = "/api/v0/users/:id/followers";
|
pub const path = "/users/:id/followers";
|
||||||
|
|
||||||
pub const Args = struct {
|
pub const Args = struct {
|
||||||
id: Uuid,
|
id: Uuid,
|
||||||
|
@ -53,7 +53,7 @@ pub const query_followers = struct {
|
||||||
|
|
||||||
pub const query_following = struct {
|
pub const query_following = struct {
|
||||||
pub const method = .GET;
|
pub const method = .GET;
|
||||||
pub const path = "/api/v0/users/:id/following";
|
pub const path = "/users/:id/following";
|
||||||
|
|
||||||
pub const Args = struct {
|
pub const Args = struct {
|
||||||
id: Uuid,
|
id: Uuid,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue