package oenv

  1. Overview
  2. Docs

Source file std.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
open Shapes

let create ?(secret = true) shape name validate =
  conceal @@ field { shape = Shape shape; name; validate; secret }
;;

let string ?secret name = create ?secret String name Result.ok

let int ?secret name =
  let validate s =
    try Ok (int_of_string s) with
    | Failure _ -> Error (`Parse ("int", s))
  in
  create ?secret Int name validate
;;

let bool ?secret name =
  create ?secret Bool name @@ function
  | "true" -> Ok true
  | "false" -> Ok false
  | v -> Error (`Parse ("bool", v))
;;

let optional s =
  map s @@ function
  | Ok v -> Ok (Some v)
  | Error (`Missing _) -> Ok None
  | Error e -> Error e
;;

let default value opt =
  map opt @@ function
  | Ok (Some v) -> Ok v
  | Ok None | Error (`Missing _) -> Ok value
  | Error e -> Error e
;;

let custom validate ?secret name = create ?secret Custom name validate

let list ?secret ?(sep = ',') name validate =
  create ?secret Custom name @@ fun s ->
  if String.length s = 0
  then Ok []
  else (
    let items = String.split_on_char sep s in
    let[@tmc] rec aux acc = function
      | [] -> Ok (List.rev acc)
      | x :: xs -> validate x |> Fun.flip Result.bind @@ fun v -> aux (v :: acc) xs
    in
    aux [] items)
;;