Packages
oaspec
0.15.0
0.68.0
0.67.0
0.66.0
0.65.0
0.64.0
0.63.0
0.62.0
0.61.0
0.60.0
0.59.0
0.58.1
0.58.0
0.57.0
0.56.0
0.55.0
0.54.0
0.53.0
0.52.0
0.51.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.3
0.6.1
0.6.0
0.5.0
0.4.0
0.3.0
0.1.3
Generate Gleam code from OpenAPI 3.x specifications
Current section
Files
Jump to
Current section
Files
src/oaspec/openapi/location_index.gleam
import gleam/dict.{type Dict}
import gleam/list
import gleam/result
import oaspec/openapi/diagnostic.{type SourceLoc, NoSourceLoc, SourceLoc}
/// An index mapping dotted JSON-pointer paths to source locations.
/// Built by parsing YAML with yamerl (which preserves line/column),
/// then looked up when emitting diagnostics.
pub opaque type LocationIndex {
LocationIndex(entries: Dict(String, SourceLoc))
}
/// Build a location index from raw YAML/JSON content.
/// On failure (e.g. invalid YAML), returns an empty index.
pub fn build(content: String) -> LocationIndex {
do_build(content)
|> result.map(fn(pairs) {
let entries =
list.fold(pairs, dict.new(), fn(acc, pair) {
let #(path, #(line, col)) = pair
dict.insert(acc, path, SourceLoc(line:, column: col))
})
LocationIndex(entries:)
})
|> result.unwrap(empty())
}
/// An empty index (no location information available).
pub fn empty() -> LocationIndex {
LocationIndex(entries: dict.new())
}
/// Look up the source location for a given path.
/// Returns `NoSourceLoc` if the path is not in the index.
pub fn lookup(index: LocationIndex, path: String) -> SourceLoc {
dict.get(index.entries, path)
|> result.unwrap(NoSourceLoc)
}
/// Look up the source location for a field within a parent path.
/// Tries `parent.field` first, then falls back to `parent`, then `NoSourceLoc`.
pub fn lookup_field(
index: LocationIndex,
parent: String,
field: String,
) -> SourceLoc {
let field_path = case parent {
"" -> field
_ -> parent <> "." <> field
}
dict.get(index.entries, field_path)
|> result.lazy_or(fn() { dict.get(index.entries, parent) })
|> result.unwrap(NoSourceLoc)
}
@external(erlang, "yaml_loc_ffi", "build_location_index")
fn do_build(content: String) -> Result(List(#(String, #(Int, Int))), Nil)