Source file window_pattern.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
open! Ppx_yojson_conv_lib.Yojson_conv
type t =
{ title : string option [@yojson.option]
; app_id : string option [@yojson.option]
; identifier : string option [@yojson.option]
; label : string option [@yojson.option]
; case : Pattern.Case.t
}
[@@deriving yojson]
let equal (a : t) (b : t) = a = b
let is_empty = function
| { title = None; app_id = None; identifier = None; label = None; case = _ } -> true
| _ -> false
;;
let to_string p =
let field_value name value =
match value with
| None -> None
| Some s -> Some (Printf.sprintf "%s=%s" name s)
in
let parts =
List.filter_map
Fun.id
[ field_value "title" p.title
; field_value "app-id" p.app_id
; field_value "identifier" p.identifier
; field_value "label" p.label
]
in
match p.case with
| Sensitive -> String.concat " " parts
| Insensitive -> String.concat " " parts |> Printf.sprintf "%s (insensitive)"
;;
let compile m =
Pattern.compile_specs
~case:m.case
[ (m.title, fun (t, _, _, _) -> Option.to_list t)
; (m.app_id, fun (_, a, _, _) -> Option.to_list a)
; (m.identifier, fun (_, _, i, _) -> Option.to_list i)
; (m.label, fun (_, _, _, ls) -> ls)
]
|> Result.map (fun m ~title ~app_id ~identifier ~labels ->
m (title, app_id, identifier, labels))
;;