Macros
@@@warning As macros are not yet supported in Java, this section is for Scala developers only. @@@
Akka Wamp provides you with some useful Scala Macros to reduce the boilerplate code you would have to write to consume/handle arguments from incoming Payloads
Futures
Macros described by this section are those you can use in writing client applications with the Akka Wamp Futures Client API.
Subscribe
It allows you to subscribe a lambda consumer to a topic.
Client().open().foreach { implicit session =>
subscribe("mytopic", (name: String, age: Int) => {
println("$name is $age years old")
})
}
This macro expands to an event consumer that expects an implicit Session object in scope. The expanded consumer is be able to apply the supplied lambda with arguments carried by incoming events. Arguments are matched to parameters as described in the deserialization section below.
Register
It allows you to subscribe a lambda handler as a procedure.
Client().open().foreach { implicit session =>
register("myproc", (name: String, age: Int) => {
name.length + age
})
}
This macro expands to an invocation handler that expects an implicit Session object in scope. The expanded handler is be able to apply the supplied lambda with arguments carried by incoming invocations. Arguments match parameters as described in the deserialization section below.
Deserialization
Incoming arguments match lambda parameters by applying the logic described in this section. Be arity the number of supplied lambda parameters, args the incoming list of indexed arguments and kwargs the (optional) incoming dictionary of named arguments, then Akka Wamp:
- Prefers to match
argsas first choice andkwargsas second. - Selects either of
argsorkwargsdepending on their length. That having length different than arity will be discarded. argsmust match data types of same position parameters.kwargsmust match parameter names too.- If neither
argsnorkwargsmatch parameters then deserialization fails withClientException
For example, any of the following incoming JSON messages:
[48,1,{},"myproc",["paolo", 99]]
[48,2,{},"myproc",["paolo", 99],{"male":true}]
[48,3,{},"myproc",[],{"name":"paolo","age":99}]
[48,4,{},"myproc",[true],{"name":"paolo","age":99}]
match the following lambda parameters:
(name: String, age: Int) => /* do something with name and age */