|
|
|
import {Route, RouteParameters, RouteSegment} from './Route.ts'
|
|
|
|
import Utility from '../../service/utility/Utility.ts'
|
|
|
|
import {make} from '../../../../di/src/global.ts'
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A route that contains route parameters and shallow wild-cards.
|
|
|
|
* @extends Route
|
|
|
|
*/
|
|
|
|
export class ComplexRoute extends Route {
|
|
|
|
public match(incoming: string): boolean {
|
|
|
|
const base_parts = this.split(this.base)
|
|
|
|
const incoming_parts = this.split(incoming)
|
|
|
|
|
|
|
|
if ( base_parts.length !== incoming_parts.length ) return false
|
|
|
|
|
|
|
|
return base_parts.every((base, idx) => {
|
|
|
|
if ( base.startsWith(':') && base.length > 1 ) return true
|
|
|
|
else if ( base === '*' ) return true
|
|
|
|
return base.toLowerCase() === incoming_parts[idx].toLowerCase()
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
public build_parameters(incoming: string): RouteParameters {
|
|
|
|
const utility = make(Utility)
|
|
|
|
const params: RouteParameters = {}
|
|
|
|
let current_wildcard: number = 1
|
|
|
|
|
|
|
|
this.zip(incoming).forEach((segment: RouteSegment) => {
|
|
|
|
if ( segment.base === '*' ) {
|
|
|
|
params[`$${current_wildcard}`] = utility.infer(segment.match)
|
|
|
|
current_wildcard += 1
|
|
|
|
} else if ( segment.base.startsWith(':') && segment.base.length > 1 ) {
|
|
|
|
const name = segment.base.substr(1)
|
|
|
|
params[name] = utility.infer(segment.match)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
return params
|
|
|
|
}
|
|
|
|
}
|