-module(oaspec@internal@openapi@filter). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/oaspec/internal/openapi/filter.gleam"). -export([path_matches/2, apply/2]). -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/oaspec/internal/openapi/filter.gleam", 80). ?DOC(false). -spec filter_op( gleam@option:option(oaspec@internal@openapi@spec:operation(oaspec@internal@openapi@spec:resolved())), fun((oaspec@internal@openapi@spec:operation(oaspec@internal@openapi@spec:resolved())) -> boolean()) ) -> gleam@option:option(oaspec@internal@openapi@spec:operation(oaspec@internal@openapi@spec:resolved())). filter_op(Op, Keep) -> case Op of none -> none; {some, O} -> case Keep(O) of true -> {some, O}; false -> none end end. -file("src/oaspec/internal/openapi/filter.gleam", 94). ?DOC(false). -spec path_item_has_operations( oaspec@internal@openapi@spec:path_item(oaspec@internal@openapi@spec:resolved()) ) -> boolean(). path_item_has_operations(Item) -> ((((((gleam@option:is_some(erlang:element(4, Item)) orelse gleam@option:is_some( erlang:element(5, Item) )) orelse gleam@option:is_some(erlang:element(6, Item))) orelse gleam@option:is_some(erlang:element(7, Item))) orelse gleam@option:is_some(erlang:element(8, Item))) orelse gleam@option:is_some(erlang:element(9, Item))) orelse gleam@option:is_some(erlang:element(10, Item))) orelse gleam@option:is_some(erlang:element(11, Item)). -file("src/oaspec/internal/openapi/filter.gleam", 124). ?DOC(false). -spec tags_match(list(binary()), list(binary())) -> boolean(). tags_match(Op_tags, Include_tags) -> gleam@list:any(Op_tags, fun(T) -> gleam@list:contains(Include_tags, T) end). -file("src/oaspec/internal/openapi/filter.gleam", 132). ?DOC(false). -spec path_matches(binary(), list(binary())) -> boolean(). path_matches(Path, Patterns) -> gleam@list:any( Patterns, fun(Pattern) -> case gleam_stdlib:string_ends_with(Pattern, <<"/**"/utf8>>) of true -> Prefix = gleam@string:drop_end(Pattern, 3), gleam_stdlib:string_starts_with( Path, <> ); false -> Path =:= Pattern end end ). -file("src/oaspec/internal/openapi/filter.gleam", 105). ?DOC(false). -spec keep_operation( binary(), oaspec@internal@openapi@spec:operation(oaspec@internal@openapi@spec:resolved()), oaspec@config:include() ) -> boolean(). keep_operation(Path, Op, Include) -> case {erlang:element(2, Include), erlang:element(3, Include)} of {[], []} -> true; {[], _} -> path_matches(Path, erlang:element(3, Include)); {_, []} -> tags_match(erlang:element(5, Op), erlang:element(2, Include)); {_, _} -> tags_match(erlang:element(5, Op), erlang:element(2, Include)) orelse path_matches( Path, erlang:element(3, Include) ) end. -file("src/oaspec/internal/openapi/filter.gleam", 61). ?DOC(false). -spec filter_path_item( binary(), oaspec@internal@openapi@spec:path_item(oaspec@internal@openapi@spec:resolved()), oaspec@config:include() ) -> oaspec@internal@openapi@spec:path_item(oaspec@internal@openapi@spec:resolved()). filter_path_item(Path, Item, Include) -> Keep = fun(Op) -> keep_operation(Path, Op, Include) end, {path_item, erlang:element(2, Item), erlang:element(3, Item), filter_op(erlang:element(4, Item), Keep), filter_op(erlang:element(5, Item), Keep), filter_op(erlang:element(6, Item), Keep), filter_op(erlang:element(7, Item), Keep), filter_op(erlang:element(8, Item), Keep), filter_op(erlang:element(9, Item), Keep), filter_op(erlang:element(10, Item), Keep), filter_op(erlang:element(11, Item), Keep), erlang:element(12, Item), erlang:element(13, Item)}. -file("src/oaspec/internal/openapi/filter.gleam", 36). ?DOC(false). -spec filter_paths( gleam@dict:dict(binary(), oaspec@internal@openapi@spec:ref_or(oaspec@internal@openapi@spec:path_item(oaspec@internal@openapi@spec:resolved()))), oaspec@config:include() ) -> gleam@dict:dict(binary(), oaspec@internal@openapi@spec:ref_or(oaspec@internal@openapi@spec:path_item(oaspec@internal@openapi@spec:resolved()))). filter_paths(Paths, Include) -> _pipe = Paths, _pipe@1 = maps:to_list(_pipe), _pipe@2 = gleam@list:filter_map( _pipe@1, fun(Entry) -> {Path, Ref_or_item} = Entry, case Ref_or_item of {value, Item} -> Filtered_item = filter_path_item(Path, Item, Include), case path_item_has_operations(Filtered_item) of true -> {ok, {Path, {value, Filtered_item}}}; false -> {error, nil} end; {ref, _} -> {ok, Entry} end end ), maps:from_list(_pipe@2). -file("src/oaspec/internal/openapi/filter.gleam", 27). ?DOC(false). -spec apply( oaspec@internal@openapi@spec:open_api_spec(oaspec@internal@openapi@spec:resolved()), oaspec@config:include() ) -> oaspec@internal@openapi@spec:open_api_spec(oaspec@internal@openapi@spec:resolved()). apply(Spec, Include) -> gleam@bool:guard( oaspec@config:include_is_empty(Include), Spec, fun() -> New_paths = filter_paths(erlang:element(4, Spec), Include), {open_api_spec, erlang:element(2, Spec), erlang:element(3, Spec), New_paths, erlang:element(5, Spec), erlang:element(6, Spec), erlang:element(7, Spec), erlang:element(8, Spec), erlang:element(9, Spec), erlang:element(10, Spec), erlang:element(11, Spec)} end ).