-module(http_server_mock@internal@router). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/http_server_mock/internal/router.gleam"). -export([score/3, find_match/3]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC(false). -file("src/http_server_mock/internal/router.gleam", 96). ?DOC(false). -spec compare_ints(integer(), integer()) -> gleam@order:order(). compare_ints(Left, Right) -> case Left < Right of true -> lt; false -> case Left > Right of true -> gt; false -> eq end end. -file("src/http_server_mock/internal/router.gleam", 73). ?DOC(false). -spec compute_score( http_server_mock@types:request_matcher(), http_server_mock@types:recorded_request() ) -> integer(). compute_score(Request_matcher, _) -> Method_score = case erlang:element(2, Request_matcher) of {some, _} -> 100; none -> 0 end, Path_score = case erlang:element(3, Request_matcher) of none -> 0; {some, {exact, _}} -> 80; {some, _} -> 40 end, Query_score = erlang:length(erlang:element(4, Request_matcher)) * 20, Header_score = erlang:length(erlang:element(5, Request_matcher)) * 10, Body_score = case erlang:element(6, Request_matcher) of any_body -> 0; {exact_body, _} -> 50; {contains_body, _} -> 30; {json_body, _} -> 30 end, (((Method_score + Path_score) + Query_score) + Header_score) + Body_score. -file("src/http_server_mock/internal/router.gleam", 52). ?DOC(false). -spec scenario_matches( http_server_mock@types:stub(), gleam@dict:dict(binary(), binary()) ) -> boolean(). scenario_matches(Stub, Scenarios) -> case erlang:element(6, Stub) of none -> true; {some, Scenario_state} -> Current = gleam_stdlib:map_get( Scenarios, erlang:element(2, Scenario_state) ), case erlang:element(3, Scenario_state) of none -> case Current of {error, nil} -> true; {ok, _} -> false end; {some, Required} -> case Current of {ok, State} -> State =:= Required; {error, nil} -> false end end end. -file("src/http_server_mock/internal/router.gleam", 38). ?DOC(false). -spec score( http_server_mock@types:stub(), gleam@dict:dict(binary(), binary()), http_server_mock@types:recorded_request() ) -> gleam@option:option(integer()). score(Stub, Scenarios, Recorded_request) -> case scenario_matches(Stub, Scenarios) andalso http_server_mock@matcher:matches( erlang:element(4, Stub), Recorded_request ) of false -> none; true -> {some, compute_score(erlang:element(4, Stub), Recorded_request)} end. -file("src/http_server_mock/internal/router.gleam", 10). ?DOC(false). -spec find_match( list(http_server_mock@types:stub()), gleam@dict:dict(binary(), binary()), http_server_mock@types:recorded_request() ) -> gleam@option:option({http_server_mock@types:stub(), http_server_mock@types:response_definition()}). find_match(Stubs, Scenarios, Recorded_request) -> Scored = begin _pipe = Stubs, _pipe@1 = gleam@list:map( _pipe, fun(Stub) -> {score(Stub, Scenarios, Recorded_request), Stub} end ), _pipe@2 = gleam@list:filter( _pipe@1, fun(Pair) -> gleam@option:is_some(erlang:element(1, Pair)) end ), _pipe@3 = gleam@list:map( _pipe@2, fun(Pair@1) -> {Score_option, Stub@1} = Pair@1, Score_value@1 = case Score_option of {some, Score_value} -> Score_value; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"http_server_mock/internal/router"/utf8>>, function => <<"find_match"/utf8>>, line => 21, value => _assert_fail, start => 628, 'end' => 671, pattern_start => 639, pattern_end => 656}) end, {Score_value@1, Stub@1} end ), gleam@list:sort( _pipe@3, fun(Left, Right) -> {Left_score, Left_stub} = Left, {Right_score, Right_stub} = Right, case erlang:element(3, Left_stub) =:= erlang:element( 3, Right_stub ) of true -> gleam@order:negate( compare_ints(Left_score, Right_score) ); false -> compare_ints( erlang:element(3, Left_stub), erlang:element(3, Right_stub) ) end end ) end, case Scored of [] -> none; [{_, Stub@2} | _] -> {some, {Stub@2, erlang:element(5, Stub@2)}} end.