Skip to content

Extractors ​

Type-safe request data extraction with compile-time validation. Extractors parse and validate request data into strongly-typed Zig structs.

Import ​

zig
const api = @import("api");
const Path = api.Path;
const Query = api.Query;
const Body = api.Body;
const Header = api.Header;

Extractor Types Summary ​

ExtractorSourceDescription
Path(T)URL pathExtract path parameters
Query(T)URL queryExtract query parameters
Body(T)Request bodyParse JSON body
Header(name)HeadersExtract header value

Extractor Methods ​

MethodDescription
.extract(ctx)Extract and parse data
.valueAccess extracted value

Path ​

Extracts path parameters into a struct.

zig
const PathParams = Path(struct {
    id: u32,
    name: []const u8,
});

fn handler(ctx: *api.Context) api.Response {
    const params = PathParams.extract(ctx) catch {
        return api.Response.err(.bad_request, "{}");
    };

    _ = params.value.id;    // u32
    _ = params.value.name;  // []const u8

    return api.Response.jsonRaw("{}");
}

Request: GET /users/123/profile/johnResult: { .id = 123, .name = "john" }

Query ​

Extracts query parameters into a struct.

zig
const QueryParams = Query(struct {
    page: u32 = 1,     // With default
    limit: u32 = 10,
    search: ?[]const u8 = null,  // Optional
});

fn handler(ctx: *api.Context) api.Response {
    const query = QueryParams.extract(ctx) catch {
        return api.Response.err(.bad_request, "{}");
    };

    _ = query.value.page;   // u32
    _ = query.value.limit;  // u32
    _ = query.value.search; // ?[]const u8

    return api.Response.jsonRaw("{}");
}

Body ​

Extracts and parses JSON request body.

zig
const CreateUserBody = Body(struct {
    name: []const u8,
    email: []const u8,
    age: u32,
});

fn createUser(ctx: *api.Context) api.Response {
    const body = CreateUserBody.extract(ctx) catch {
        return api.Response.err(.bad_request, "{\"error\":\"Invalid body\"}");
    };

    _ = body.value.name;
    _ = body.value.email;
    _ = body.value.age;

    return api.Response.jsonRaw("{\"created\":true}")
        .setStatus(.created);
}

Extracts a specific header.

zig
const AuthHeader = Header("Authorization");
const ContentTypeHeader = Header("Content-Type");

fn handler(ctx: *api.Context) api.Response {
    const auth = AuthHeader.extract(ctx) catch {
        return api.Response.err(.unauthorized, "{}");
    };

    _ = auth.value;  // Header value

    return api.Response.jsonRaw("{}");
}

Extracts a specific cookie from the request.

zig
const SessionCookie = api.extractors.Cookie("session_id");

fn handler(ctx: *api.Context) api.Response {
    const session = SessionCookie.extract(ctx) catch {
        return api.Response.err(.unauthorized, "{}");
    };

    _ = session.value;  // Cookie value

    return api.Response.jsonRaw("{}");
}

Depends (Dependency Injection) ​

Calls a function to provide a dependency.

zig
fn getDatabase(ctx: *api.Context) !Database {
    _ = ctx;
    return Database.init();
}

const DbDep = api.extractors.Depends(getDatabase);

fn handler(ctx: *api.Context) api.Response {
    const db = DbDep.extract(ctx) catch {
        return api.Response.err(.internal_server_error, "{}");
    };

    _ = db.value;  // Database instance

    return api.Response.jsonRaw("{}");
}

Built-in Header Extractors ​

zig
const Authorization = api.extractors.Authorization;
const ContentType = api.extractors.ContentType;
const UserAgent = api.extractors.UserAgent;

Supported Types ​

Path and Query extractors support:

TypeExample
Integersu32, i64, etc.
Floatsf32, f64
Booleansbool
Strings[]const u8
Optionals?u32, ?[]const u8

Example ​

zig
const PathParams = Path(struct { id: u32 });
const QueryParams = Query(struct { include_deleted: bool = false });
const CreateBody = Body(struct { name: []const u8 });

fn updateUser(ctx: *api.Context) api.Response {
    const path = PathParams.extract(ctx) catch return api.Response.err(.bad_request, "{}");
    const query = QueryParams.extract(ctx) catch return api.Response.err(.bad_request, "{}");
    const body = CreateBody.extract(ctx) catch return api.Response.err(.bad_request, "{}");

    _ = path.value.id;
    _ = query.value.include_deleted;
    _ = body.value.name;

    return api.Response.jsonRaw("{\"updated\":true}");
}

Released under the MIT License.