55 lines
1.9 KiB
OCaml
55 lines
1.9 KiB
OCaml
(* open Utilities.Aliases *)
|
|
open Lexer
|
|
|
|
type schema = Schema.schema
|
|
type token = Lexer.token
|
|
type config = Schema.main
|
|
|
|
let default_config: config = Schema.origin.input.configuration.main
|
|
|
|
(*
|
|
TODO: The `elog` calls in this module's functions cause cram tests
|
|
to fail. Separate logging levels can be implemented to solve this.
|
|
*)
|
|
|
|
let update config key value: config =
|
|
match key with
|
|
| Schema.SuCommand ->
|
|
(* elog $ "[c.parser.update] Setting value '" ^ value ^ "'"; *)
|
|
{ config with Schema.su_command = value }
|
|
| Unknown ->
|
|
(* elog $ "[c.parser.update] Dropping value: unknown key"; *)
|
|
config
|
|
|
|
let parse tokens =
|
|
let rec parse_tokens tokens config ready_key =
|
|
match tokens with
|
|
| [] -> config
|
|
| Key key :: tail ->
|
|
(* elog $ "[c.parser.parse ] Picked key '" ^ *)
|
|
(* Schema.string_of_key key ^ "'"; *)
|
|
parse_tokens tail config (Some key)
|
|
| Value value :: tail ->
|
|
(* elog $ "[c.parser.parse ] Picked value '" ^ value ^ "'"; *)
|
|
(match ready_key with
|
|
| Some key -> parse_tokens tail (update config key value) None
|
|
| None -> raise (Malformed_source "Value lacks preceding key"))
|
|
| Unknown _char :: tail ->
|
|
(* elog $ "[c.parser.parse ] Dropping unknown token " ^ str_char char; *)
|
|
parse_tokens tail config ready_key
|
|
| (Space|Equal|LineBreak|End) :: tail ->
|
|
parse_tokens tail config ready_key
|
|
|
|
in
|
|
parse_tokens tokens default_config None
|
|
|
|
let apply (origin: Schema.schema) (config: config): Schema.schema =
|
|
{ origin with input = {
|
|
origin.input with configuration = {
|
|
origin.input.configuration with main = config
|
|
}
|
|
}}
|
|
|
|
let string_of_config (config: config): string =
|
|
"su_command = " ^ config.su_command ^ "\n" ^
|
|
""
|