module OI = Colitur_kernel.Overlay_ini type t = { lang : string option; overlays : string list; template : string option; format : string option; unknown_keys : string list; } let empty = { lang = None; overlays = []; template = None; format = None; unknown_keys = [] } let lang t = t.lang let overlays t = t.overlays let template t = t.template let format t = t.format let unknown_keys t = t.unknown_keys let of_string text = match OI.parse_sections text with | Error e -> Error e | Ok sections -> ( match List.find_opt (fun (s : OI.section) -> s.OI.name = "defaults") sections with | None -> Ok empty | Some s -> let acc = List.fold_left (fun acc (k, v) -> match k with | "lang" -> { acc with lang = Some v } | "template" -> { acc with template = Some v } | "format" -> { acc with format = Some v } (* accumulates: a user has more than one overlay *) | "overlay" -> { acc with overlays = acc.overlays @ [ v ] } | other -> { acc with unknown_keys = acc.unknown_keys @ [ other ] }) empty s.OI.fields in Ok acc) let resolve ~flag ~config ~default = match flag with | Some v -> (v, "flag") | None -> ( match config with Some v -> (v, "config") | None -> (default, "default"))