dromloc/src/app.ml
2022-11-01 16:34:05 +01:00

95 lines
2.5 KiB
OCaml

module App_id = struct
let qualifier = "org"
let organization = "Dromloc"
let application = "dromloc"
end
module Project_dirs = Directories.Project_dirs (App_id)
let data_dir =
match Project_dirs.data_dir with
| None -> failwith "can't compute data directory"
| Some data_dir -> data_dir
let config_dir =
match Project_dirs.config_dir with
| None -> failwith "can't compute configuration directory"
| Some config_dir -> config_dir
let config =
let filename = Filename.concat config_dir "config.scfg" in
if not @@ Sys.file_exists filename then
failwith
@@ Format.sprintf "configuration file `%s` does not exist, please create it"
filename;
Dream.log "config file: %s" filename;
match Scfg.Parse.from_file filename with
| Error e -> failwith e
| Ok config -> config
let open_registration =
match Scfg.Query.get_dir "open_registration" config with
| None -> true
| Some open_registration -> (
match Scfg.Query.get_param 0 open_registration with
| Error e -> failwith e
| Ok "true" -> true
| Ok "false" -> false
| Ok _unknown ->
failwith "invalid `open_registration` value in configuration file" )
let () = Dream.log "open_registration: %b" open_registration
let port =
match Scfg.Query.get_dir "port" config with
| None -> 8080
| Some port -> (
match Scfg.Query.get_param 0 port with
| Error e -> failwith e
| Ok n -> (
try
let n = int_of_string n in
if n < 0 then raise (Invalid_argument "negative port number");
n
with Invalid_argument _msg ->
failwith "invalid `port` value in configuration file" ) )
let () = Dream.log "port: %d" port
let hostname =
match Scfg.Query.get_dir "hostname" config with
| None -> Format.sprintf "localhost:%d" port
| Some hostname ->
Result.fold ~error:failwith ~ok:Fun.id (Scfg.Query.get_param 0 hostname)
let () = Dream.log "hostname: %s" hostname
let log =
match Scfg.Query.get_dir "log" config with
| None -> true
| Some log -> (
match Scfg.Query.get_param 0 log with
| Error e -> failwith e
| Ok "true" -> true
| Ok "false" -> false
| Ok _unknown -> failwith "invalid `log` value in configuration file" )
let () = Dream.log "log: %b" log
let get_dirs name =
let dirs = Scfg.Query.get_dirs name config in
List.map
(fun dir ->
Result.fold ~error:failwith ~ok:Fun.id (Scfg.Query.get_param 0 dir) )
dirs
let random_state = Random.State.make_self_init ()
let () = Random.set_state random_state
let about =
(* TODO read from about.txt *)
"This is dromloc"