app/jsonimplicits/implicits.scala (129 lines of code) (raw):
package jsonimplicits
import java.time.format.DateTimeFormatter
import java.time.{Instant, ZoneId, ZoneOffset}
import _root_.model.{Owner, SSA}
import agent._
import collectors._
import org.joda.time.DateTime
import org.joda.time.format.ISODateTimeFormat
import play.api.libs.json.{JsString, _}
import play.api.mvc.RequestHeader
trait RequestWrites[T] {
def writes(request: RequestHeader): Writes[T]
}
object RequestWrites {
def fromWrites[T](implicit delegate: Writes[T]): RequestWrites[T] =
(_: RequestHeader) => delegate
}
object joda {
implicit object dateTimeWrites extends Writes[org.joda.time.DateTime] {
def writes(d: org.joda.time.DateTime): JsValue = JsString(
ISODateTimeFormat.dateTime.print(d)
)
}
implicit val dateTimeReads: Reads[DateTime] =
JodaReads.jodaDateReads("yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
}
object model {
import joda.dateTimeWrites
val formatter: DateTimeFormatter = DateTimeFormatter
.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXX")
.withZone(ZoneId.from(ZoneOffset.UTC))
implicit val instantWrites: Writes[Instant] =
Writes.temporalWrites[Instant, DateTimeFormatter](formatter)
implicit val originWriter: Writes[Origin] = (o: Origin) => o.toJson
implicit val securityGroupRefWriter: Writes[SecurityGroupRef] =
Json.writes[SecurityGroupRef]
implicit val securityGroupRuleWriter: Writes[Rule] = Json.writes[Rule]
implicit val securityGroupWriter: Writes[SecurityGroup] =
Json.writes[SecurityGroup]
implicit def instanceRequestWriter(implicit
refWriter: Writes[Reference[SecurityGroup]]
): Writes[Instance] = {
implicit val addressWriter: Writes[Address] = Json.writes[Address]
implicit val instanceSpecificationWriter: Writes[InstanceSpecification] =
Json.writes[InstanceSpecification]
implicit val managementEndpointWriter: Writes[ManagementEndpoint] =
Json.writes[ManagementEndpoint]
Json.writes[Instance]
}
implicit val valueWriter: Writes[Value] = Json.writes[Value]
implicit val dataWriter: Writes[Data] = Json.writes[Data]
implicit val imageWriter: Writes[Image] = Json.writes[Image]
implicit val launchConfigurationWriter: Writes[LaunchConfiguration] =
Json.writes[LaunchConfiguration]
implicit val launchTemplateWriter: Writes[LaunchTemplateVersion] =
Json.writes[LaunchTemplateVersion]
implicit val bucketWriter: Writes[Bucket] = Json.writes[Bucket]
implicit val lambdaWriter: Writes[Lambda] = Json.writes[Lambda]
implicit val reservationWriter: Writes[Reservation] = {
implicit val recurringCharge: Writes[RecurringCharge] =
Json.writes[RecurringCharge]
Json.writes[Reservation]
}
implicit val domainResourceRecordWriter: Writes[DomainResourceRecord] =
Json.writes[DomainResourceRecord]
implicit val domainValidationWriter: Writes[DomainValidation] =
Json.writes[DomainValidation]
implicit val renewalInfoWriter: Writes[RenewalInfo] = Json.writes[RenewalInfo]
implicit val acmCertificateWriter: Writes[AcmCertificate] =
Json.writes[AcmCertificate]
implicit val route53AliasWriter: Writes[Route53Alias] =
Json.writes[Route53Alias]
implicit val route53RecordWriter: Writes[Route53Record] =
Json.writes[Route53Record]
implicit val route53ZoneWriter: Writes[Route53Zone] = Json.writes[Route53Zone]
implicit val subnetWriter: Writes[Subnet] = Json.writes[Subnet]
implicit val vpcWriter: Writes[Vpc] = Json.writes[Vpc]
implicit val loadBalancerWriter: Writes[LoadBalancer] =
Json.writes[LoadBalancer]
implicit val awsAccountWrites: Writes[AWSAccount] = Json.writes[AWSAccount]
implicit val labelWriter: Writes[Label] = (l: Label) => {
Json.obj(
"resource" -> l.resourceType.name,
"origin" -> l.origin
) ++ basicLabelWriter.writes(l).as[JsObject]
}
val basicLabelWriter: Writes[Label] = (l: Label) => {
Json.obj(
"status" -> l.status,
"createdAt" -> l.createdAt,
"itemCount" -> l.itemCount,
"age" -> l.bestBefore.age.getStandardSeconds,
"stale" -> l.bestBefore.isStale
) ++
l.error
.map { error =>
Json.obj(
"message" -> s"${error.getClass.getName}: ${error.getMessage}",
"stacktrace" -> error.getStackTrace.map(_.toString).take(5)
)
}
.getOrElse(Json.obj())
}
implicit val sourceStatusWriter: Writes[SourceStatus] =
new Writes[SourceStatus] {
implicit val labelWriter: Writes[Label] = basicLabelWriter
implicit val writes: OWrites[SourceStatus] = Json.writes[SourceStatus]
def writes(o: SourceStatus): JsValue = {
Json.obj(
"resource" -> o.state.resourceType.name,
"origin" -> o.state.origin,
"status" -> o.latest.status
) ++ Json.toJson(o).as[JsObject]
}
}
implicit val ssaWriter: Writes[SSA] = (ssa: SSA) => {
JsObject(
Seq("stack" -> JsString(ssa.stack)) ++
ssa.stage.map(stage => "stage" -> JsString(stage)) ++
ssa.app.map(app => "app" -> JsString(app))
)
}
implicit val ownerWriter: Writes[Owner] = (o: Owner) => {
Json.obj(
"id" -> o.id,
"stacks" -> Json.toJson(o.ssas)
)
}
}