(* TODO test *)
(* Crockford's variant of Base32
   http://www.crockford.com/wrmg/base32.html
   except that:
     - 'U' is not excluded but also decodes to 'V'
     - '-' is not allowed
     - checksum is not allowed *)

(* 'I' 'L' 'O' 'U' excluded *)
type t = string

let alphabet = Base32.make_alphabet "0123456789ABCDEFGHJKMNPQRSTVWXYZ"
let encode s = Base32.encode_string ~alphabet s

let decode s =
  let s =
    String.map
      (fun c ->
        match Char.uppercase_ascii c with
        | 'O' -> '0'
        | 'I' | 'L' -> '1'
        | 'U' -> 'V'
        | c -> c)
      s
  in
  match Base32.decode ~alphabet ~off:0 ~len:(String.length s) s with
  | Error (`Msg e) -> Error e
  | Ok v -> Ok v
