-module(oaspec@openapi@location_index). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/oaspec/openapi/location_index.gleam"). -export([empty/0, lookup/2, lookup_field/3, 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. -opaque location_index() :: {location_index, gleam@dict:dict(binary(), oaspec@openapi@diagnostic:source_loc())}. -file("src/oaspec/openapi/location_index.gleam", 29). ?DOC(" An empty index (no location information available).\n"). -spec empty() -> location_index(). empty() -> {location_index, maps:new()}. -file("src/oaspec/openapi/location_index.gleam", 35). ?DOC( " Look up the source location for a given path.\n" " Returns `NoSourceLoc` if the path is not in the index.\n" ). -spec lookup(location_index(), binary()) -> oaspec@openapi@diagnostic:source_loc(). lookup(Index, Path) -> case gleam_stdlib:map_get(erlang:element(2, Index), Path) of {ok, Loc} -> Loc; {error, _} -> no_source_loc end. -file("src/oaspec/openapi/location_index.gleam", 44). ?DOC( " Look up the source location for a field within a parent path.\n" " Tries `parent.field` first, then falls back to `parent`, then `NoSourceLoc`.\n" ). -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, case gleam_stdlib:map_get(erlang:element(2, Index), Field_path) of {ok, Loc} -> Loc; {error, _} -> case gleam_stdlib:map_get(erlang:element(2, Index), Parent) of {ok, Loc@1} -> Loc@1; {error, _} -> no_source_loc end end. -file("src/oaspec/openapi/location_index.gleam", 14). ?DOC( " Build a location index from raw YAML/JSON content.\n" " On failure (e.g. invalid YAML), returns an empty index.\n" ). -spec build(binary()) -> location_index(). build(Content) -> case yaml_loc_ffi:build_location_index(Content) of {ok, 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}; {error, _} -> empty() end.