Current section
Files
Jump to
Current section
Files
src/glean@middleware.erl
-module(glean@middleware).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/glean/middleware.gleam").
-export([request_middleware/1, result_middleware/1, apply/2, chain/1]).
-export_type([middleware/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type middleware() :: {middleware,
gleam@option:option(fun((glean@provider:generate_request()) -> glean@provider:generate_request())),
gleam@option:option(fun((glean@provider:generate_result()) -> glean@provider:generate_result()))}.
-file("src/glean/middleware.gleam", 23).
?DOC(" Create a middleware that only transforms requests.\n").
-spec request_middleware(
fun((glean@provider:generate_request()) -> glean@provider:generate_request())
) -> middleware().
request_middleware(Transform) ->
{middleware, {some, Transform}, none}.
-file("src/glean/middleware.gleam", 30).
?DOC(" Create a middleware that only transforms results.\n").
-spec result_middleware(
fun((glean@provider:generate_result()) -> glean@provider:generate_result())
) -> middleware().
result_middleware(Transform) ->
{middleware, none, {some, Transform}}.
-file("src/glean/middleware.gleam", 81).
-spec identity_middleware() -> middleware().
identity_middleware() ->
{middleware, none, none}.
-file("src/glean/middleware.gleam", 85).
-spec apply_transform(JAE, gleam@option:option(fun((JAE) -> JAE))) -> JAE.
apply_transform(Value, Transform) ->
case Transform of
none ->
Value;
{some, F} ->
F(Value)
end.
-file("src/glean/middleware.gleam", 49).
?DOC(" Wrap a provider with middleware, producing a new provider.\n").
-spec apply(glean@provider:provider(), middleware()) -> glean@provider:provider().
apply(Provider, Middleware) ->
Transform_req = erlang:element(2, Middleware),
Transform_res = erlang:element(3, Middleware),
New_generate = fun(Request) ->
Request@1 = apply_transform(Request, Transform_req),
case (erlang:element(4, Provider))(Request@1) of
{ok, Result} ->
{ok, apply_transform(Result, Transform_res)};
{error, Err} ->
{error, Err}
end
end,
New_stream = fun(Request@2, On_event) ->
Request@3 = apply_transform(Request@2, Transform_req),
case (erlang:element(5, Provider))(Request@3, On_event) of
{ok, Result@1} ->
{ok, apply_transform(Result@1, Transform_res)};
{error, Err@1} ->
{error, Err@1}
end
end,
{provider,
erlang:element(2, Provider),
erlang:element(3, Provider),
New_generate,
New_stream}.
-file("src/glean/middleware.gleam", 92).
-spec compose_option(
gleam@option:option(fun((JAG) -> JAG)),
gleam@option:option(fun((JAG) -> JAG))
) -> gleam@option:option(fun((JAG) -> JAG)).
compose_option(First, Second) ->
case {First, Second} of
{none, none} ->
none;
{{some, F}, none} ->
{some, F};
{none, {some, G}} ->
{some, G};
{{some, F@1}, {some, G@1}} ->
{some, fun(X) -> G@1(F@1(X)) end}
end.
-file("src/glean/middleware.gleam", 39).
?DOC(
" Chain multiple middlewares into one. Applied left-to-right:\n"
" first middleware's request transform runs first,\n"
" last middleware's result transform runs last.\n"
).
-spec chain(list(middleware())) -> middleware().
chain(Middlewares) ->
gleam@list:fold(
Middlewares,
identity_middleware(),
fun(Acc, Mw) ->
{middleware,
compose_option(erlang:element(2, Acc), erlang:element(2, Mw)),
compose_option(erlang:element(3, Acc), erlang:element(3, Mw))}
end
).