-module(oaspec@internal@openapi@location_index). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/oaspec/internal/openapi/location_index.gleam"). -export([empty/0, lookup/2, lookup_field/3, lookup_with_ancestor/2, build/1]). -export_type([location_index/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. ?MODULEDOC(false). -opaque location_index() :: {location_index, gleam@dict:dict(binary(), oaspec@openapi@diagnostic:source_loc())}. -file("src/oaspec/internal/openapi/location_index.gleam", 30). ?DOC(false). -spec empty() -> location_index(). empty() -> {location_index, maps:new()}. -file("src/oaspec/internal/openapi/location_index.gleam", 36). ?DOC(false). -spec lookup(location_index(), binary()) -> oaspec@openapi@diagnostic:source_loc(). lookup(Index, Path) -> _pipe = gleam_stdlib:map_get(erlang:element(2, Index), Path), gleam@result:unwrap(_pipe, no_source_loc). -file("src/oaspec/internal/openapi/location_index.gleam", 43). ?DOC(false). -spec lookup_field(location_index(), binary(), binary()) -> oaspec@openapi@diagnostic:source_loc(). lookup_field(Index, Parent, Field) -> Field_path = case Parent of <<""/utf8>> -> Field; _ -> <<<>/binary, Field/binary>> end, _pipe = gleam_stdlib:map_get(erlang:element(2, Index), Field_path), _pipe@1 = gleam@result:lazy_or( _pipe, fun() -> gleam_stdlib:map_get(erlang:element(2, Index), Parent) end ), gleam@result:unwrap(_pipe@1, no_source_loc). -file("src/oaspec/internal/openapi/location_index.gleam", 65). ?DOC(false). -spec lookup_with_ancestor(location_index(), binary()) -> oaspec@openapi@diagnostic:source_loc(). lookup_with_ancestor(Index, Path) -> case gleam_stdlib:map_get(erlang:element(2, Index), Path) of {ok, Loc} -> Loc; {error, _} -> case gleam@string:split(Path, <<"."/utf8>>) of [] -> no_source_loc; [_] -> no_source_loc; Segments -> Parent_segments = case lists:reverse(Segments) of [_ | Rest_rev] -> lists:reverse(Rest_rev); [] -> [] end, case Parent_segments of [] -> no_source_loc; _ -> lookup_with_ancestor( Index, gleam@string:join(Parent_segments, <<"."/utf8>>) ) end end end. -file("src/oaspec/internal/openapi/location_index.gleam", 16). ?DOC(false). -spec build(binary()) -> location_index(). build(Content) -> _pipe = yaml_loc_ffi:build_location_index(Content), _pipe@1 = gleam@result:map( _pipe, fun(Pairs) -> Entries = gleam@list:fold( Pairs, maps:new(), fun(Acc, Pair) -> {Path, {Line, Col}} = Pair, gleam@dict:insert(Acc, Path, {source_loc, Line, Col}) end ), {location_index, Entries} end ), gleam@result:unwrap(_pipe@1, empty()).