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
open! Import
type t = string
module Invalid = struct
type t =
| Empty_name
| Begins_with_dash
| Invalid_char of char
end
let invalid_chars = [ '=' ]
let find_invalid_char string = List.find_opt invalid_chars ~f:(String.contains string)
let is_invalid_char char = List.exists invalid_chars ~f:(( = ) char)
let check_invalid_char string =
match find_invalid_char string with
| Some invalid_char -> Error (Invalid.Invalid_char invalid_char)
| None -> Ok ()
;;
let of_string string =
let open Result.O in
if String.is_empty string
then Error Invalid.Empty_name
else if String.starts_with string ~prefix:"-"
then Error Begins_with_dash
else
let+ () = check_invalid_char string in
string
;;
let of_string_exn string =
match of_string string with
| Ok t -> t
| Error _ -> raise (Invalid_argument "Name.of_string_exn")
;;
let to_string t = t
let equal = String.equal
let kind t =
match String.length t with
| 1 -> `Short
| n ->
assert (n > 1);
`Long
;;
let is_short t =
match kind t with
| `Short -> true
| `Long -> false
;;
let is_long t =
match kind t with
| `Short -> false
| `Long -> true
;;
let to_string_with_dashes t =
let prefix =
match kind t with
| `Short -> "-"
| `Long -> "--"
in
String.cat prefix t
;;
let chip_short_name_off_string string =
if String.starts_with string ~prefix:"-"
then Error Invalid.Begins_with_dash
else (
match String.length string with
| 0 -> Error Invalid.Empty_name
| 1 ->
let char = String.get string 0 in
if is_invalid_char char then Error (Invalid_char char) else Ok (string, "")
| n ->
let char = String.get string 0 in
if is_invalid_char char
then Error (Invalid_char char)
else (
let name = String.make 1 char in
let rest = String.sub string ~pos:1 ~len:(n - 1) in
Ok (name, rest)))
;;
module Set = Set.Make (String)
module Map = Map.Make (String)