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
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 }