diff options
Diffstat (limited to 'src/config_file.ml')
-rw-r--r-- | src/config_file.ml | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/config_file.ml b/src/config_file.ml new file mode 100644 index 0000000..d8dc8c9 --- /dev/null +++ b/src/config_file.ml @@ -0,0 +1,44 @@ +(* strip commponent version string *) +let strip_version s = + let rex = Pcre2.regexp ~flags:[`MULTILINE;`DOTALL] "(^//.*)" in + let res = Pcre2.split ~max:0 ~rex s in + match res with + | h :: _ -> Ok h + | [] -> Error "Failure stripping version string from config" + +let load_config file = + try + let chan = open_in file in + let s = really_input_string chan (in_channel_length chan) in + let () = close_in chan in + let prep = strip_version s in + let s = match prep with + | Ok s -> s + | Error msg -> raise (Sys_error msg) + in + let config = Parser.from_string s in + Ok config + with + | Sys_error msg -> Error msg + | Util.Syntax_error (opt, msg) -> + begin + match opt with + | None -> + let out = Printf.sprintf "Parse error: %s\n" msg + in Error out + | Some (line, pos) -> + let out = Printf.sprintf "Parse error: %s line %d pos %d\n" msg line pos + in Error out + end + +let save_config ct file = + try + let s = Config_tree.render_config ct in + let chan = open_out file in + let () = output_string chan s in + let () = close_out chan in + let () = Unix.chmod file 0o664 in + Ok () + with + Sys_error msg -> Error msg + |