@@ -135,19 +135,21 @@ module Cro::HTTP::Router {
135
135
has & . implementation ;
136
136
has Hash [Array , Cro::HTTP::Router::PluginKey] $ . plugin-config ;
137
137
has Hash [Array , Cro::HTTP::Router::PluginKey] $ . flattened-plugin-config ;
138
+ has Bool $ . from-include ;
138
139
139
140
method copy-adding (: @ prefix , : @ body-parsers ! , : @ body-serializers ! , : @ before-matched ! , : @ after-matched ! , : @ around ! ,
140
- Hash [Array , Cro::HTTP::Router::PluginKey] : $ plugin-config , : $ name-prefix ) {
141
+ Hash [Array , Cro::HTTP::Router::PluginKey] : $ plugin-config , : $ name-prefix , : $ from-include ! ) {
141
142
self . bless :
142
- : $ ! method , : & ! implementation , | (name => ($ name-prefix // ' ' ) ~ $ ! name with $ ! name ),
143
+ : $ ! method , : & ! implementation , | (name => ($ name-prefix ?? " $ name-prefix . " !! ' ' ) ~ $ ! name with $ ! name ),
143
144
: prefix[flat @ prefix , @ ! prefix ],
144
145
: body-parsers[flat @ ! body-parsers , @ body-parsers ],
145
146
: body-serializers[flat @ ! body-serializers , @ body-serializers ],
146
147
: before-matched[flat @ before-matched , @ ! before-matched ],
147
148
: after-matched[flat @ ! after-matched , @ after-matched ],
148
149
: around[flat @ ! around , @ around ],
149
150
: $ ! plugin-config ,
150
- : flattened-plugin-config(merge-plugin-config($ plugin-config , $ ! flattened-plugin-config // $ ! plugin-config ))
151
+ : flattened-plugin-config(merge-plugin-config($ plugin-config , $ ! flattened-plugin-config // $ ! plugin-config )),
152
+ : $ from-include
151
153
}
152
154
153
155
sub merge-plugin-config ($ outer , $ inner ) {
@@ -301,6 +303,7 @@ module Cro::HTTP::Router {
301
303
with $ routing-outcome {
302
304
my ($ handler-idx , $ args ) = . ast;
303
305
my $ handler := @ ! handlers [$ handler-idx ];
306
+ my % * URLS = % ! urls ;
304
307
whenever $ handler . invoke($ request , $ args ) -> $ response {
305
308
emit $ response ;
306
309
QUIT {
@@ -347,7 +350,7 @@ module Cro::HTTP::Router {
347
350
method add-handler (Str $ method , & implementation , Str : $ name --> Nil ) {
348
351
@ ! handlers-to-add . push : {
349
352
@ ! handlers . push (RouteHandler. new (: $ method , : & implementation , : @ ! before-matched , : @ ! after-matched ,
350
- : @ ! around , : % ! plugin-config , : $ name ));
353
+ : @ ! around , : % ! plugin-config , : $ name , :! from-include ));
351
354
}
352
355
}
353
356
@@ -411,7 +414,7 @@ module Cro::HTTP::Router {
411
414
for @ ! includes -> (: @ prefix , : $ includee , : $ name-prefix ) {
412
415
for $ includee . handlers() {
413
416
@ ! handlers . push : . copy-adding(: @ prefix , : @ ! body-parsers , : @ ! body-serializers ,
414
- : @ ! before-matched , : @ ! after-matched , : @ ! around , : % ! plugin-config , : $ name-prefix );
417
+ : @ ! before-matched , : @ ! after-matched , : @ ! around , : % ! plugin-config , : $ name-prefix , : from-include );
415
418
}
416
419
}
417
420
self ! generate-route-matcher();
@@ -421,9 +424,11 @@ module Cro::HTTP::Router {
421
424
method ! generate-urls () {
422
425
my % urls ;
423
426
my $ prefix = $ . name // " " ;
427
+ $ prefix ~ = ' .' if $ prefix ;
424
428
for @ . handlers -> $ handler {
425
429
if $ handler ~~ RouteHandler && $ handler . name . defined {
426
- my $ key = $ prefix ~ $ handler . name ;
430
+ my $ key = $ handler . from-include ?? $ handler . name !! $ prefix ~ $ handler . name ;
431
+ next if $ handler . from-include and not $ key . contains (' .' );
427
432
die X::Cro::HTTP::Router::DuplicateLinkName . new (: $ key ) if % urls {$ key }: exists ;
428
433
% urls {$ key } = route-signature-to-sub($ handler . signature );
429
434
}
@@ -576,7 +581,7 @@ module Cro::HTTP::Router {
576
581
577
582
# Turned nameds into unpacks.
578
583
for @ named -> $ param {
579
- my $ target-name = $ param . named_names[0 ];
584
+ my $ target-name = $ param . slurpy ?? $ param . name !! $ param . named_names[0 ];
580
585
my ($ exists , $ lookup ) = do given $ param {
581
586
when Cookie {
582
587
' $req.has-cookie(Q[' ~ $ target-name ~ ' ])' ,
@@ -756,17 +761,17 @@ module Cro::HTTP::Router {
756
761
sub include (* @ includees , * % includees --> Nil ) is export {
757
762
for @ includees {
758
763
when RouteSet {
759
- $ * CRO-ROUTE-SET . add-include([], $ _ );
764
+ $ * CRO-ROUTE-SET . add-include([], $ _ , name-prefix => $ _ . name );
760
765
}
761
766
when Pair {
762
767
my ($ prefix , $ routes ) = . kv ;
763
768
if $ routes ~~ RouteSet {
764
769
given $ prefix {
765
770
when Str {
766
- $ * CRO-ROUTE-SET . add-include([$ prefix ], $ routes );
771
+ $ * CRO-ROUTE-SET . add-include([$ prefix ], $ routes , name-prefix => $ routes . name );
767
772
}
768
773
when Iterable {
769
- $ * CRO-ROUTE-SET . add-include($ prefix , $ routes );
774
+ $ * CRO-ROUTE-SET . add-include($ prefix , $ routes , name-prefix => $ routes . name );
770
775
}
771
776
default {
772
777
die " An 'include' prefix may be a Str or Iterable, but not " ~ .^ name ;
@@ -1321,6 +1326,16 @@ module Cro::HTTP::Router {
1321
1326
}
1322
1327
}
1323
1328
1329
+ sub make-link ($ route-name , * @ args , * % args ) is export {
1330
+ my $ maker = % * URLS {$ route-name } // Nil ;
1331
+ with $ maker {
1332
+ return $ _ (| @ args , | % args );
1333
+ } else {
1334
+ warn " Called the make-link subroutine with $ route-name but no such route defined" ;
1335
+ " " ;
1336
+ }
1337
+ }
1338
+
1324
1339
# | Register a router plugin. The provided ID is for debugging purposes.
1325
1340
# | Returns a plugin key object which can be used for further interactions
1326
1341
# | with the router plugin infrastructure.
0 commit comments