scala - Hoes do Spray Parameters work? -
i'm trying wrap head around how spray has implemented directives, , in particular parameter extraction dsl.
i understand magnet pattern (barely) stuck on how paramdefmagnet , paramdefmagnet2 work together.
def parameter(pdm: paramdefmagnet): pdm.out = pdm() trait paramdefmagnet { type out def apply(): out } trait paramdefmagnet2[t] { type out def apply(value: t): out } type paramdefmagnetaux[a, b] = paramdefmagnet2[a] { type out = b } def paramdefmagnetaux[a, b](f: ⇒ b) = new paramdefmagnet2[a] { type out = b; def apply(value: a) = f(value) }
i'm trying work out how paramdefmanget2 implicitly converted paramdefmagnet the below implicit method.
object paramdefmagnet { implicit def apply[t](value: t)(implicit pdm2: paramdefmagnet2[t]) = new paramdefmagnet { type out = pdm2.out def apply() = pdm2(value) } }
if call parameter("name")
, how "name" implicitly converted paramdefmagnet
? , if converts paramdefmagnet2
first, value: t
come in order convert paramdefmagnet
?
so after digging around examples, think i've got bottom of how parameter function works:
def parameter(pdm: paramdefmagnet): pdm.out = pdm()
an example extracting parameter of type string:
val p: directive1[string] = parameter("name") // can apply function extracted name p { name => // stuff }
spray uses bunch of implicit conversions basically, if have string
, string => directive1[string]
, can construct () => directive1[string]
:
// our string => directive1[string] val pdm2: paramdefmagnet2[string] { type out = directive1[string] } = paramdefmagnet2.fromstring // our () => directive1[string] val pdm: paramdefmagnet { type out = directive1[string] } = new paramdefmagnet { type out = directive1[string] def apply() = pdm2("name") } val directive: directive1[string] = pdm() // equivalent to: val directive2: directive1[string] = parameter("name")
all of constitutes simple parameter("name")
call:
val p: directive1[string] = parameter("name")
for how directive1[string]
applied in dsl-ey way, see how directives work in spray?