Current section

Files

Jump to
oaspec src oaspec@codegen@middleware.erl
Raw

src/oaspec@codegen@middleware.erl

-module(oaspec@codegen@middleware).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/oaspec/codegen/middleware.gleam").
-export([generate/1]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-file("src/oaspec/codegen/middleware.gleam", 17).
?DOC(" Generate the middleware types and utilities.\n").
-spec generate_middleware(oaspec@codegen@context:context()) -> binary().
generate_middleware(Ctx) ->
Sb = begin
_pipe = oaspec@util@string_extra:file_header(<<"0.12.0"/utf8>>),
oaspec@util@string_extra:imports(_pipe, [])
end,
Sb@1 = begin
_pipe@1 = Sb,
_pipe@2 = oaspec@util@string_extra:doc_comment(
_pipe@1,
<<"A handler is a function that takes a request and returns a result."/utf8>>
),
_pipe@3 = oaspec@util@string_extra:line(
_pipe@2,
<<"pub type Handler(req, res) ="/utf8>>
),
_pipe@4 = oaspec@util@string_extra:indent(
_pipe@3,
1,
<<"fn(req) -> Result(res, MiddlewareError)"/utf8>>
),
oaspec@util@string_extra:blank_line(_pipe@4)
end,
Sb@2 = begin
_pipe@5 = Sb@1,
_pipe@6 = oaspec@util@string_extra:doc_comment(
_pipe@5,
<<"A middleware wraps a handler to add cross-cutting concerns."/utf8>>
),
_pipe@7 = oaspec@util@string_extra:doc_comment(
_pipe@6,
<<"Middleware is composable: each middleware takes a handler and returns"/utf8>>
),
_pipe@8 = oaspec@util@string_extra:doc_comment(
_pipe@7,
<<"a new handler with added behavior."/utf8>>
),
_pipe@9 = oaspec@util@string_extra:line(
_pipe@8,
<<"pub type Middleware(req, res) ="/utf8>>
),
_pipe@10 = oaspec@util@string_extra:indent(
_pipe@9,
1,
<<"fn(Handler(req, res)) -> Handler(req, res)"/utf8>>
),
oaspec@util@string_extra:blank_line(_pipe@10)
end,
Sb@3 = begin
_pipe@11 = Sb@2,
_pipe@12 = oaspec@util@string_extra:doc_comment(
_pipe@11,
<<"Errors that middleware can produce."/utf8>>
),
_pipe@13 = oaspec@util@string_extra:line(
_pipe@12,
<<"pub type MiddlewareError {"/utf8>>
),
_pipe@14 = oaspec@util@string_extra:indent(
_pipe@13,
1,
<<"Unauthorized(detail: String)"/utf8>>
),
_pipe@15 = oaspec@util@string_extra:indent(
_pipe@14,
1,
<<"Forbidden(detail: String)"/utf8>>
),
_pipe@16 = oaspec@util@string_extra:indent(
_pipe@15,
1,
<<"BadRequest(detail: String)"/utf8>>
),
_pipe@17 = oaspec@util@string_extra:indent(
_pipe@16,
1,
<<"InternalError(detail: String)"/utf8>>
),
_pipe@18 = oaspec@util@string_extra:indent(
_pipe@17,
1,
<<"CustomError(code: Int, detail: String)"/utf8>>
),
_pipe@19 = oaspec@util@string_extra:line(_pipe@18, <<"}"/utf8>>),
oaspec@util@string_extra:blank_line(_pipe@19)
end,
Sb@4 = begin
_pipe@20 = Sb@3,
_pipe@21 = oaspec@util@string_extra:doc_comment(
_pipe@20,
<<"Identity middleware that passes the request through unchanged."/utf8>>
),
_pipe@22 = oaspec@util@string_extra:line(
_pipe@21,
<<"pub fn identity() -> Middleware(req, res) {"/utf8>>
),
_pipe@23 = oaspec@util@string_extra:indent(
_pipe@22,
1,
<<"fn(handler: Handler(req, res)) -> Handler(req, res) {"/utf8>>
),
_pipe@24 = oaspec@util@string_extra:indent(
_pipe@23,
2,
<<"handler"/utf8>>
),
_pipe@25 = oaspec@util@string_extra:indent(_pipe@24, 1, <<"}"/utf8>>),
_pipe@26 = oaspec@util@string_extra:line(_pipe@25, <<"}"/utf8>>),
oaspec@util@string_extra:blank_line(_pipe@26)
end,
Sb@5 = begin
_pipe@27 = Sb@4,
_pipe@28 = oaspec@util@string_extra:doc_comment(
_pipe@27,
<<"Compose two middleware functions."/utf8>>
),
_pipe@29 = oaspec@util@string_extra:doc_comment(
_pipe@28,
<<"The first middleware is applied first (outermost),"/utf8>>
),
_pipe@30 = oaspec@util@string_extra:doc_comment(
_pipe@29,
<<"the second middleware is applied second (innermost)."/utf8>>
),
_pipe@31 = oaspec@util@string_extra:line(
_pipe@30,
<<"pub fn compose("/utf8>>
),
_pipe@32 = oaspec@util@string_extra:indent(
_pipe@31,
1,
<<"first: Middleware(req, res),"/utf8>>
),
_pipe@33 = oaspec@util@string_extra:indent(
_pipe@32,
1,
<<"second: Middleware(req, res),"/utf8>>
),
_pipe@34 = oaspec@util@string_extra:line(
_pipe@33,
<<") -> Middleware(req, res) {"/utf8>>
),
_pipe@35 = oaspec@util@string_extra:indent(
_pipe@34,
1,
<<"fn(handler: Handler(req, res)) -> Handler(req, res) {"/utf8>>
),
_pipe@36 = oaspec@util@string_extra:indent(
_pipe@35,
2,
<<"first(second(handler))"/utf8>>
),
_pipe@37 = oaspec@util@string_extra:indent(_pipe@36, 1, <<"}"/utf8>>),
_pipe@38 = oaspec@util@string_extra:line(_pipe@37, <<"}"/utf8>>),
oaspec@util@string_extra:blank_line(_pipe@38)
end,
Sb@6 = begin
_pipe@39 = Sb@5,
_pipe@40 = oaspec@util@string_extra:doc_comment(
_pipe@39,
<<"Apply a list of middleware to a handler."/utf8>>
),
_pipe@41 = oaspec@util@string_extra:doc_comment(
_pipe@40,
<<"Middleware is applied in order: first in list = outermost."/utf8>>
),
_pipe@42 = oaspec@util@string_extra:line(
_pipe@41,
<<"pub fn apply("/utf8>>
),
_pipe@43 = oaspec@util@string_extra:indent(
_pipe@42,
1,
<<"middlewares: List(Middleware(req, res)),"/utf8>>
),
_pipe@44 = oaspec@util@string_extra:indent(
_pipe@43,
1,
<<"handler: Handler(req, res),"/utf8>>
),
_pipe@45 = oaspec@util@string_extra:line(
_pipe@44,
<<") -> Handler(req, res) {"/utf8>>
),
_pipe@46 = oaspec@util@string_extra:indent(
_pipe@45,
1,
<<"case middlewares {"/utf8>>
),
_pipe@47 = oaspec@util@string_extra:indent(
_pipe@46,
2,
<<"[] -> handler"/utf8>>
),
_pipe@48 = oaspec@util@string_extra:indent(
_pipe@47,
2,
<<"[mw, ..rest] -> mw(apply(rest, handler))"/utf8>>
),
_pipe@49 = oaspec@util@string_extra:indent(_pipe@48, 1, <<"}"/utf8>>),
_pipe@50 = oaspec@util@string_extra:line(_pipe@49, <<"}"/utf8>>),
oaspec@util@string_extra:blank_line(_pipe@50)
end,
Sb@7 = begin
_pipe@51 = Sb@6,
_pipe@52 = oaspec@util@string_extra:doc_comment(
_pipe@51,
<<"Example: A logging middleware stub."/utf8>>
),
_pipe@53 = oaspec@util@string_extra:doc_comment(
_pipe@52,
<<"Replace the body with your logging implementation."/utf8>>
),
_pipe@54 = oaspec@util@string_extra:line(
_pipe@53,
<<"pub fn logging() -> Middleware(req, res) {"/utf8>>
),
_pipe@55 = oaspec@util@string_extra:indent(
_pipe@54,
1,
<<"fn(handler: Handler(req, res)) -> Handler(req, res) {"/utf8>>
),
_pipe@56 = oaspec@util@string_extra:indent(
_pipe@55,
2,
<<"fn(request: req) -> Result(res, MiddlewareError) {"/utf8>>
),
_pipe@57 = oaspec@util@string_extra:indent(
_pipe@56,
3,
<<"// TODO: Add logging before/after the handler call"/utf8>>
),
_pipe@58 = oaspec@util@string_extra:indent(
_pipe@57,
3,
<<"handler(request)"/utf8>>
),
_pipe@59 = oaspec@util@string_extra:indent(_pipe@58, 2, <<"}"/utf8>>),
_pipe@60 = oaspec@util@string_extra:indent(_pipe@59, 1, <<"}"/utf8>>),
_pipe@61 = oaspec@util@string_extra:line(_pipe@60, <<"}"/utf8>>),
oaspec@util@string_extra:blank_line(_pipe@61)
end,
Sb@8 = begin
_pipe@62 = Sb@7,
_pipe@63 = oaspec@util@string_extra:doc_comment(
_pipe@62,
<<"Retry middleware for client operations."/utf8>>
),
_pipe@64 = oaspec@util@string_extra:doc_comment(
_pipe@63,
<<"Retries the handler up to max_retries times on failure."/utf8>>
),
_pipe@65 = oaspec@util@string_extra:line(
_pipe@64,
<<"pub fn retry(max_retries: Int) -> Middleware(req, res) {"/utf8>>
),
_pipe@66 = oaspec@util@string_extra:indent(
_pipe@65,
1,
<<"fn(handler: Handler(req, res)) -> Handler(req, res) {"/utf8>>
),
_pipe@67 = oaspec@util@string_extra:indent(
_pipe@66,
2,
<<"fn(request: req) -> Result(res, MiddlewareError) {"/utf8>>
),
_pipe@68 = oaspec@util@string_extra:indent(
_pipe@67,
3,
<<"do_retry(handler, request, max_retries, 0)"/utf8>>
),
_pipe@69 = oaspec@util@string_extra:indent(_pipe@68, 2, <<"}"/utf8>>),
_pipe@70 = oaspec@util@string_extra:indent(_pipe@69, 1, <<"}"/utf8>>),
_pipe@71 = oaspec@util@string_extra:line(_pipe@70, <<"}"/utf8>>),
oaspec@util@string_extra:blank_line(_pipe@71)
end,
Sb@9 = begin
_pipe@72 = Sb@8,
_pipe@73 = oaspec@util@string_extra:line(
_pipe@72,
<<"fn do_retry("/utf8>>
),
_pipe@74 = oaspec@util@string_extra:indent(
_pipe@73,
1,
<<"handler: Handler(req, res),"/utf8>>
),
_pipe@75 = oaspec@util@string_extra:indent(
_pipe@74,
1,
<<"request: req,"/utf8>>
),
_pipe@76 = oaspec@util@string_extra:indent(
_pipe@75,
1,
<<"max_retries: Int,"/utf8>>
),
_pipe@77 = oaspec@util@string_extra:indent(
_pipe@76,
1,
<<"attempt: Int,"/utf8>>
),
_pipe@78 = oaspec@util@string_extra:line(
_pipe@77,
<<") -> Result(res, MiddlewareError) {"/utf8>>
),
_pipe@79 = oaspec@util@string_extra:indent(
_pipe@78,
1,
<<"case handler(request) {"/utf8>>
),
_pipe@80 = oaspec@util@string_extra:indent(
_pipe@79,
2,
<<"Ok(response) -> Ok(response)"/utf8>>
),
_pipe@81 = oaspec@util@string_extra:indent(
_pipe@80,
2,
<<"Error(err) -> {"/utf8>>
),
_pipe@82 = oaspec@util@string_extra:indent(
_pipe@81,
3,
<<"case attempt < max_retries {"/utf8>>
),
_pipe@83 = oaspec@util@string_extra:indent(
_pipe@82,
4,
<<"True -> do_retry(handler, request, max_retries, attempt + 1)"/utf8>>
),
_pipe@84 = oaspec@util@string_extra:indent(
_pipe@83,
4,
<<"False -> Error(err)"/utf8>>
),
_pipe@85 = oaspec@util@string_extra:indent(_pipe@84, 3, <<"}"/utf8>>),
_pipe@86 = oaspec@util@string_extra:indent(_pipe@85, 2, <<"}"/utf8>>),
_pipe@87 = oaspec@util@string_extra:indent(_pipe@86, 1, <<"}"/utf8>>),
_pipe@88 = oaspec@util@string_extra:line(_pipe@87, <<"}"/utf8>>),
oaspec@util@string_extra:blank_line(_pipe@88)
end,
_ = Ctx,
oaspec@util@string_extra:to_string(Sb@9).
-file("src/oaspec/codegen/middleware.gleam", 5).
?DOC(" Generate middleware module.\n").
-spec generate(oaspec@codegen@context:context()) -> list(oaspec@codegen@context:generated_file()).
generate(Ctx) ->
Content = generate_middleware(Ctx),
[{generated_file, <<"middleware.gleam"/utf8>>, Content, shared_target}].