You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

41 lines
1.4 KiB

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