OCaml library for Crockford's Base32
1(*---------------------------------------------------------------------------
2 Copyright (c) 2025 Anil Madhavapeddy. All rights reserved.
3 SPDX-License-Identifier: MIT
4 ---------------------------------------------------------------------------*)
5
6let generate_doi prefix length split =
7 Random.self_init ();
8 let suffix = Crockford.generate ~length ~split_every:split ~checksum:true () in
9 Printf.printf "%s/%s\n%!" prefix suffix
10
11let () =
12 let open Cmdliner in
13
14 let prefix =
15 let doc = "DOI prefix to use (e.g., 10.59350)" in
16 Arg.(value & opt string "10.59350" & info ["p"; "prefix"] ~docv:"PREFIX" ~doc)
17 in
18
19 let length =
20 let doc = "Total length of the generated suffix (including checksum)" in
21 Arg.(value & opt int 10 & info ["l"; "length"] ~docv:"LENGTH" ~doc)
22 in
23
24 let split =
25 let doc = "Split the suffix every N characters with hyphens (0 = no splitting)" in
26 Arg.(value & opt int 5 & info ["s"; "split"] ~docv:"SPLIT" ~doc)
27 in
28
29 let generate_cmd =
30 let doc = "Generate a random DOI with Crockford base32 encoding" in
31 let info = Cmd.info "roguedoi" ~version:"1.0.0" ~doc in
32 Cmd.v info Term.(const generate_doi $ prefix $ length $ split)
33 in
34
35 exit (Cmd.eval generate_cmd)