package climate

  1. Overview
  2. Docs

Source file name.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
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)
OCaml

Innovation. Community. Security.