app/collectors/data.scala (50 lines of code) (raw):

package collectors import play.api.libs.json.{Json, Reads} import play.api.mvc.Call import controllers.routes import agent._ import scala.concurrent.duration._ import scala.language.postfixOps import scala.util.matching.Regex class DataCollectorSet(accounts: Accounts) extends CollectorSet[Data](ResourceType("data"), accounts, None) { def lookupCollector: PartialFunction[Origin, Collector[Data]] = { case json: JsonOrigin => JsonDataCollector(json, resource, json.crawlRate(resource.name)) } } case class JsonDataCollector( origin: JsonOrigin, resource: ResourceType, crawlRate: CrawlRate ) extends JsonCollector[Data] { implicit val valueReads: Reads[Value] = Json.reads[Value] implicit val dataReads: Reads[Data] = Json.reads[Data] def crawl: Iterable[Data] = crawlJson } case class Data(key: String, values: Seq[Value]) extends IndexedItem { def arn: String = s"arn:gu:data:key/$key" def callFromArn: String => Call = arn => routes.Api.data(arn) def firstMatchingData( stack: String, app: String, stage: String ): Option[Value] = { values.find { data => data.appRegex.findFirstMatchIn(app).isDefined && data.stageRegex.findFirstMatchIn(stage).isDefined && data.stackRegex.findFirstMatchIn(stack).isDefined } } } case class Value( stack: String, app: String, stage: String, value: String, comment: Option[String] ) { lazy val stackRegex: Regex = s"^$stack$$".r lazy val appRegex: Regex = s"^$app$$".r lazy val stageRegex: Regex = s"^$stage$$".r }