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;
 | 
						|
    }
 | 
						|
}
 |