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.

42 lines
1.2 KiB

import {logger} from "../../service/logging/global.ts";
export type RouteParameters = { [key: string]: string }
export type RouteSegment = { base: string, match: string | undefined }
export type ZippedRouteSegments = RouteSegment[]
export abstract class Route {
constructor(
protected base: string
) { }
public abstract match(incoming: string): boolean
public abstract build_parameters(incoming: string): RouteParameters
public get route() {
return this.base
}
public split(incoming: string) {
return incoming.toLowerCase().split('/')
}
public zip(incoming: string) {
const incoming_parts: string[] = this.split(incoming)
const base_parts: string[] = this.split(this.base)
const zipped_parts: ZippedRouteSegments = []
if ( incoming_parts.length !== base_parts.length ) {
logger.warn(`Zipping routes with different part lengths! (Base: ${this.base}, Incoming: ${incoming}`)
}
base_parts.forEach((part, index) => {
zipped_parts.push({
base: part,
match: (index >= incoming_parts.length ? undefined : incoming_parts[index]),
})
})
return zipped_parts
}
}