40 lines
1 KiB
OCaml
40 lines
1 KiB
OCaml
type t = [ `Strict | `Wildcard ] * [ `host ] Domain_name.t
|
|
|
|
let pp_typ ppf = function
|
|
| `Strict -> Fmt.nop ppf ()
|
|
| `Wildcard -> Fmt.string ppf "*."
|
|
|
|
let pp ppf (typ, nam) =
|
|
Fmt.pf ppf "%a%a" pp_typ typ Domain_name.pp nam
|
|
|
|
module Set = struct
|
|
include Set.Make(struct
|
|
type nonrec t = t
|
|
let compare a b = match a, b with
|
|
| (`Strict, a), (`Strict, b)
|
|
| (`Wildcard, a), (`Wildcard, b) -> Domain_name.compare a b
|
|
| (`Strict, _), (`Wildcard, _) -> -1
|
|
| (`Wildcard, _), (`Strict, _) -> 1
|
|
end)
|
|
|
|
let pp ppf s =
|
|
Fmt.(list ~sep:(any ", ") pp) ppf (elements s)
|
|
end
|
|
|
|
let is_wildcard name =
|
|
match Domain_name.get_label name 0 with
|
|
| Ok "*" -> Some (Domain_name.drop_label_exn name)
|
|
| _ -> None
|
|
|
|
let host name =
|
|
match Domain_name.of_string name with
|
|
| Error _ -> None
|
|
| Ok dn ->
|
|
let wild, name = match is_wildcard dn with
|
|
| None -> `Strict, dn
|
|
| Some dn' -> `Wildcard, dn'
|
|
in
|
|
match Domain_name.host name with
|
|
| Error _ -> None
|
|
| Ok hostname -> Some (wild, hostname)
|
|
|