Source file config.ml

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
(*****************************************************************************)
(*                                                                           *)
(*  Copyright (C) 2026 Yves Ndiaye                                           *)
(*                                                                           *)
(* This Source Code Form is subject to the terms of the Mozilla Public       *)
(* License, v. 2.0. If a copy of the MPL was not distributed with this       *)
(* file, You can obtain one at https://mozilla.org/MPL/2.0/.                 *)
(*                                                                           *)
(*****************************************************************************)

type t = {
  collection : Collection.t;
  query : Query.t;
  default : Default.t;
  format : Format.t;
  misc : Misc.t;
  plugins : Plugin.t list;
}

let init collection query default format misc plugins =
  { collection; query; default; format; misc; plugins }

let minimal ~name ~database ~music_directory ~plugins_directory =
  let collection =
    Collection.init ~name ~database ~music_directory ~plugins_directory
  in
  let query = Query.default in
  let default = Default.default in
  let format = Format.default in
  let misc = Misc.default in
  let plugins = [] in
  { collection; query; default; format; misc; plugins }

let parse_section section conv conf =
  let se = Raw.find_section (String.equal section) conf in
  match se with
  | None ->
      Error (Err.missing_section section)
  | Some se ->
      conv se

let parse_section' default section conv conf =
  let se = Raw.find_section (String.equal section) conf in
  match se with None -> default | Some se -> conv se

let of_file path =
  let ( let* ) = Result.bind in
  let conf = Raw.of_line path in
  let* collection =
    parse_section Collection.section Collection.of_section conf
  in
  let query =
    parse_section' Query.default Query.section Query.of_section conf
  in
  let default =
    parse_section' Default.default Default.section Default.of_section conf
  in
  let format =
    parse_section' Format.default Format.section Format.of_section conf
  in
  let misc = parse_section' Misc.default Misc.section Misc.of_section conf in
  let plugins_sections = Raw.filter_section Plugin.section_matches conf in
  let plugins = List.map Plugin.of_section plugins_sections in
  Ok { collection; query; default; format; misc; plugins }

let to_conf t =
  let { collection; query; default; format; misc; plugins } = t in
  let collection = Collection.to_section collection in
  let query = Query.to_section query in
  let default = Default.to_section default in
  let format = Format.to_section format in
  let misc = Misc.to_section misc in
  let plugins = List.map Plugin.to_section plugins in
  Raw.init [] (collection :: query :: default :: format :: misc :: plugins)

let plugin_conf name (t : t) =
  match
    List.find_map
      (fun plugin ->
        match Plugin.name plugin = name with
        | true ->
            Some (Plugin.config plugin)
        | false ->
            None
      )
      t.plugins
  with
  | Some conf ->
      conf
  | None ->
      Plugin.Config.empty

let to_channel oc t = Raw.to_channel oc (to_conf t)
let collection t = t.collection
let query t = t.query
let default t = t.default
let format t = t.format
let misc t = t.misc
let collection_name t = t |> collection |> Collection.name
let music_directory t = t |> collection |> Collection.music_directory
let music_database t = t |> collection |> Collection.database
let plugins_directory t = t |> collection |> Collection.plugins_directory
let query_fields t = t |> query |> Query.fields
let default_title t = t |> default |> Default.title
let default_album t = t |> default |> Default.album
let default_artist t = t |> default |> Default.artist
let unicode_normalize_form t = t |> misc |> Misc.unicode_normalization_form

let set_duplicate_query query t =
  { t with misc = t |> misc |> Misc.set_duplicate_query query }