package oxbow

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file output_match.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
open! Ppx_yojson_conv_lib.Yojson_conv

type t =
  { name : string option [@yojson.option]
  ; label : string option [@yojson.option]
  ; case : Pattern.Case.t
  ; invert : bool
  }
[@@deriving yojson]

let is_empty = function
  | { name = None; label = None; case = _; invert = _ } -> true
  | _ -> false
;;

let to_string m =
  let field_value name value =
    match value with
    | None -> None
    | Some s -> Some (Printf.sprintf "%s=%s" name s)
  in
  let invert = if m.invert then Some "[invert]" else None in
  let parts =
    List.filter_map
      Fun.id
      [ field_value "name" m.name; field_value "label" m.label; invert ]
  in
  let body = String.concat " " parts in
  match m.case with
  | Sensitive -> body
  | Insensitive -> Printf.sprintf "%s (insensitive)" body
;;

let compile m =
  Pattern.compile_specs
    ~case:m.case
    [ (m.name, fun (n, _) -> Option.to_list n); (m.label, fun (_, ls) -> ls) ]
  |> Result.map (fun m ~name ~labels -> m (name, labels))
;;