package scalaz
package http
package response
sealed trait ResponseHeader {
val asString: String
lazy val isEntity = this match {
case Entity(_) => true
case _ => false
}
lazy val isGeneral = this match {
case General(_) => true
case _ => false
}
def entity[X](f: EntityHeader => X, x: => X) = this match {
case Entity(h) => f(h)
case _ => x
}
def general[X](f: GeneralHeader => X, x: => X) = this match {
case General(h) => f(h)
case _ => x
}
}
final case object AcceptRanges extends ResponseHeader {
override val asString = "Accept-Ranges"
}
final case object Age extends ResponseHeader {
override val asString = toString
}
final case object ETag extends ResponseHeader {
override val asString = toString
}
final case object Location extends ResponseHeader {
override val asString = toString
}
final case object ProxyAuthenticate extends ResponseHeader {
override val asString = "Proxy-Authenticate"
}
final case object RetryAfter extends ResponseHeader {
override val asString = "Retry-After"
}
final case object Server extends ResponseHeader {
override val asString = toString
}
final case object Vary extends ResponseHeader {
override val asString = toString
}
final case object WWWAuthenticate extends ResponseHeader {
override val asString = "WWW-Authenticate"
}
private final case class Entity(eh: EntityHeader) extends ResponseHeader {
override val asString = eh.asString
}
private final case class General(gh: GeneralHeader) extends ResponseHeader {
override val asString = gh.asString
}
import Scalaz._
trait ResponseHeaders {
implicit def entityToResponse(eh: EntityHeader): ResponseHeader = scalaz.http.response.Entity(eh)
implicit def generalToResponse(gh: GeneralHeader): ResponseHeader = scalaz.http.response.General(gh)
implicit def ResponseHeaderString(rh: ResponseHeader) = rh.asString
implicit def StringResponseHeader(s: String): Option[ResponseHeader] =
ResponseHeader.headers find { case (n, h) => n == s } map (_._2) orElse
(s: Option[GeneralHeader]) ∘ (scalaz.http.response.General(_)) orElse
(s: Option[EntityHeader]) ∘ (scalaz.http.response.Entity(_))
}
object ResponseHeader extends ResponseHeaders {
object Entity {
def unapply(h: ResponseHeader) = h match {
case scalaz.http.response.Entity(x) => Some(x)
case _ => None
}
}
object General {
def unapply(h: ResponseHeader) = h match {
case scalaz.http.response.General(x) => Some(x)
case _ => None
}
}
val headers = List(("accept-ranges", AcceptRanges),
("age", Age),
("etag", ETag),
("location", Location),
("proxy-authenticate", ProxyAuthenticate),
("retry-after", RetryAfter),
("server", Server),
("vary", Vary),
("www-authenticate", WWWAuthenticate))
}