summaryrefslogtreecommitdiff
path: root/src/config_file.ml
diff options
context:
space:
mode:
Diffstat (limited to 'src/config_file.ml')
-rw-r--r--src/config_file.ml44
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
+