Packages
oaspec
0.12.0
0.68.0
0.67.0
0.66.0
0.65.0
0.64.0
0.63.0
0.62.0
0.61.0
0.60.0
0.59.0
0.58.1
0.58.0
0.57.0
0.56.0
0.55.0
0.54.0
0.53.0
0.52.0
0.51.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.3
0.6.1
0.6.0
0.5.0
0.4.0
0.3.0
0.1.3
Generate Gleam code from OpenAPI 3.x specifications
Current section
Files
Jump to
Current section
Files
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}].