open Core.Std

module Tcp : sig
  type t 
  val of_string : string -> t
  val to_string : t -> string 
  val create    : host:string -> port:int -> t
end = struct
  type t = string
  let of_string x =
    assert (String.is_prefix ~prefix:"tcp://" x);
    x
  let create ~host ~port =
    assert (port > 0);
    Printf.sprintf "tcp://%s:%d" host port
  let to_string x = x
end

module Ipc : sig
  type t 
  val of_string : string -> t
  val to_string : t -> string 
  val create    : string -> t
end = struct
  type t = string
  let of_string x =
    assert (String.is_prefix ~prefix:"ipc://" x);
    x
  let create name =
    Printf.sprintf "ipc://%s" name
  let to_string x = x
end

module Inproc : sig
  type t 
  val of_string : string -> t
  val to_string : t -> string 
  val create    : string -> t
end = struct
  type t = string
  let of_string x =
    assert (String.is_prefix ~prefix:"inproc://" x);
    x
  let create name =
    Printf.sprintf "inproc://%s" name
  let to_string x = x
end

type t =
| Tcp    of Tcp.t
| Ipc    of Ipc.t
| Inproc of Inproc.t

let to_string = function
| Tcp x -> Tcp.to_string x
| Ipc x -> Ipc.to_string x
| Inproc x -> Inproc.to_string x