mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
103 lines
2.0 KiB
Raku
103 lines
2.0 KiB
Raku
use Bailador::App;
|
|
use Bailador::Request;
|
|
use Bailador::Response;
|
|
use Bailador::Context;
|
|
use HTTP::Easy::PSGI;
|
|
|
|
module Bailador;
|
|
|
|
my $app = Bailador::App.current;
|
|
|
|
our sub import {
|
|
my $file = callframe(1).file;
|
|
my $slash = $file.rindex('/');
|
|
if $slash {
|
|
$app.location = $file.substr(0, $file.rindex('/'));
|
|
} else {
|
|
$app.location = '.';
|
|
}
|
|
}
|
|
|
|
sub route_to_regex($route) {
|
|
$route.split('/').map({
|
|
my $r = $_;
|
|
if $_.substr(0, 1) eq ':' {
|
|
$r = q{(<-[\/\.]>+)};
|
|
}
|
|
$r
|
|
}).join("'/'");
|
|
}
|
|
|
|
multi parse_route(Str $route) {
|
|
my $r = route_to_regex($route);
|
|
return "/ ^ $r \$ /".eval;
|
|
}
|
|
|
|
multi parse_route($route) {
|
|
# do nothing
|
|
$route
|
|
}
|
|
|
|
sub get(Pair $x) is export {
|
|
my $p = parse_route($x.key) => $x.value;
|
|
$app.add_route: 'GET', $p;
|
|
return $x;
|
|
}
|
|
|
|
sub post(Pair $x) is export {
|
|
my $p = parse_route($x.key) => $x.value;
|
|
$app.add_route: 'POST', $p;
|
|
return $x;
|
|
}
|
|
|
|
sub request is export { $app.context.request }
|
|
|
|
sub content_type(Str $type) is export {
|
|
$app.response.headers<Content-Type> = $type;
|
|
}
|
|
|
|
sub header(Str $name, Cool $value) is export {
|
|
$app.response.headers{$name} = ~$value;
|
|
}
|
|
|
|
sub status(Int $code) is export {
|
|
$app.response.code = $code;
|
|
}
|
|
|
|
sub template(Str $tmpl, *@params) is export {
|
|
$app.template($tmpl, @params);
|
|
}
|
|
|
|
our sub dispatch_request(Bailador::Request $r) {
|
|
return dispatch($r.env);
|
|
}
|
|
|
|
sub dispatch($env) {
|
|
$app.context.env = $env;
|
|
|
|
my ($r, $match) = $app.find_route($env);
|
|
|
|
if $r {
|
|
status 200;
|
|
if $match {
|
|
$app.response.content = $r.value.(|$match.list);
|
|
} else {
|
|
$app.response.content = $r.value.();
|
|
}
|
|
}
|
|
|
|
return $app.response;
|
|
}
|
|
|
|
sub dispatch-psgi($env) {
|
|
return dispatch($env).psgi;
|
|
}
|
|
|
|
sub baile is export {
|
|
given HTTP::Easy::PSGI.new(port => 3000) {
|
|
.app(&dispatch-psgi);
|
|
say "Entering the development dance floor: http://0.0.0.0:3000";
|
|
.run;
|
|
}
|
|
}
|