package httpz

sealed abstract class Time{
  type A
  def request: Request
  def http: Long
  def result: A
}

object Time {
  final case class Success(
    request: Request, result: Response[ByteArray], http: Long, parse: Long, decode: Long
  ) extends Time {
    type A = Response[ByteArray]
    override def toString = {
      ("request" -> request.toString) +: Seq(
        "http" -> http,
        "parse" -> parse,
        "decode" -> decode
      ).map{case (k, v) => k -> (v / 1000000.0).toString}
    }.map{case (k, v) => s"${k.toString} = ${v.toString}"}.mkString("Time.Success(", ", ", ")")
  }

  final case class Failure(
    request: Request, result: Throwable, http: Long
  ) extends Time {
    type A = Throwable
    override def toString = s"Time.Failure(request = ${request}, http = ${http / 1000000.0})"
  }
}