While these are based on part 4 of the series they are applicable to later parts and indeed I will integrate these in due course.
One thing I do want to point out now is the use of a parser instead of an explicit pattern match dispatching URLs to specific functions. Very briefly the code which reads:
function start(url)
{
match (url)
{
case {path: [] ... }: hello();
case {path: ["expressions" ] ... } : expressionsRESTendpoint();
case {path: ["expressions" | [ key | _ ] ] ...} : expressionWithKeyRESTendpoint(key);
case {~path ...}: error();
}
}
Server.start(
Server.http,
[ {resources: @static_include_directory("resources")} , {dispatch: start} ]
);
can be rewritten using a parser:
start = parser {
case "/": hello();
case "/expressions" : expressionsRESTendpoint();
case "/expressions/" key=((!"/".)*) (.*): expressionWithKeyRESTendpoint(Text.to_string(key));
default: error();
}
Server.start(
Server.http,
[ {resources: @static_include_directory("resources")} , {custom: start} ]
);
Which performs more or less the same function with the bonus that we obtain much more flexibility in how we process the URL - rather than treating it statically in the pattern matching. Note how we're no longer calling an explicit function but now have a parser as first-class object :-)
At this time there's relatively little documentation on the parser in Opa, but on the Opa Blog there's a tantalizing glimpse of what is possible.
So with that to whet your appetites go and download the latest nightly build and start coding...while I finalise composing part 5...
No comments:
Post a Comment