Skip to content

Instantly share code, notes, and snippets.

View daviddenton's full-sized avatar

David Denton daviddenton

View GitHub Profile
@daviddenton
daviddenton / Main.kt
Last active June 23, 2020 20:32
Bunting - A nano command-line flags library extracted from http4k
class MyGreatFlags(args: Array<String>) : Bunting(args) {
val user by requiredFlag()
val password by requiredFlag()
val version by defaultedFlag("0.0.0")
}
// run the main with: java (...) Mainkt --user foo --password bar
fun main(args: Array<String>) = MyGreatFlags(args).use {
println(user) // foo
println(password) // bar
@daviddenton
daviddenton / main.kt
Created May 18, 2020 08:15
Customising CatchLensFailure
import org.http4k.core.Body
import org.http4k.core.Method
import org.http4k.core.Request
import org.http4k.core.Response
import org.http4k.core.Status
import org.http4k.core.then
import org.http4k.filter.DebuggingFilters
import org.http4k.filter.ServerFilters
import org.http4k.format.Jackson.auto
import org.http4k.core.HttpHandler
import org.http4k.core.Method
import org.http4k.core.Request
import org.http4k.core.Response
import org.http4k.core.Status
import org.http4k.core.Uri
import org.http4k.core.then
import org.http4k.events.AutoJsonEvents
import org.http4k.events.Event
import org.http4k.events.EventFilters
@daviddenton
daviddenton / main.kt
Last active January 20, 2019 15:21
validating primitive values with lenses
fun main(args: Array<String>) {
data class ValidatedNumber(val value: Long) {
init {
if (value < 0 || value > 100) throw IllegalArgumentException("Out of range")
}
}
val lens = Query.long().map(::ValidatedNumber).required("myLong")
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "0"
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
name: docker-registry
spec:
backend:
@daviddenton
daviddenton / metrics.kt
Last active January 13, 2018 14:35
spike for http4k metrics code with micrometer framework
package org.http4k.metrics
import io.micrometer.core.instrument.Counter
import io.micrometer.core.instrument.MeterRegistry
import io.micrometer.core.instrument.Tags
import io.micrometer.core.instrument.Timer
import org.http4k.core.Filter
import org.http4k.core.Request
import org.http4k.filter.ResponseFilters.ReportLatency
import java.time.Clock
@daviddenton
daviddenton / Echo.scala
Created October 4, 2017 08:38
Example custom protocol for Finagle
package com.twitter.finagle
import java.net.SocketAddress
import com.twitter.finagle.client.{StackClient, StdStackClient, Transporter}
import com.twitter.finagle.dispatch.{SerialClientDispatcher, SerialServerDispatcher}
import com.twitter.finagle.netty4.{Netty4Listener, Netty4Transporter}
import com.twitter.finagle.server.{Listener, StackServer, StdStackServer}
import com.twitter.finagle.transport.Transport
import io.netty.channel.ChannelPipeline
// add this method, and verb variants to ApiBuilder...
public static void get(String path, Function<Javalin, Handler> fn) {
staticInstance().get(prefixPath(path), fn.apply(staticInstance()));
}
// then you can remove the extra methods from ApiBuilder and Javalin which take the overloads
package examples
import scala.language.implicitConversions
sealed trait ExtractedValue[T]
class ArgExtractor[T](desired: Manifest[T]) {
def unapply[X](c: X)(implicit m: Manifest[X]): Option[T] = {
def sameArgs = desired.typeArguments.zip(m.typeArguments).forall { case (d, actual) => d >:> actual }
if (desired >:> m && sameArgs) Some(c.asInstanceOf[T])