summaryrefslogtreecommitdiff
path: root/src/config_file.ml
blob: 17d3f1bb630a44439ccae558389d06912d452fa4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
(* strip commponent version string *)
let strip_version s =
    let rex = Pcre.regexp ~flags:[`MULTILINE;`DOTALL] "(^//.*)" in
    let res = Pcre.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