-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.7.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}].