Skip to content

Instantly share code, notes, and snippets.

@hxsf
Last active March 3, 2020 04:30
Show Gist options
  • Save hxsf/54c6a63c90aa699986e4abf946eeec08 to your computer and use it in GitHub Desktop.
Save hxsf/54c6a63c90aa699986e4abf946eeec08 to your computer and use it in GitHub Desktop.
route match
function check_item(rule, url, params) {
var pos_s = rule.indexOf('{')
var pos_e = rule.indexOf('}')
if (pos_s >= 0 && pos_e) {
var r_after = rule.slice(0, pos_s)
var key = rule.slice(pos_s + 1, pos_e)
var r_be = rule.slice(pos_e + 1, rule.length)
var pos_2 = url.lastIndexOf(r_be)
var u_after = url.slice(0, pos_s)
var value = url.slice(pos_s, pos_2)
var u_be = url.slice(pos_2, url.length)
if (r_after === u_after && r_be === u_be) {
params[key] = value
return true
} else {
return false
}
} else
return rule.toLowerCase() === url.toLowerCase()
}
}
function getParamsByRouter(url, rules) {
let url_items = url.split('/')
for (let index = 0, length = rules.length; index < length; index++) {
let rule = rules[index]
let flag = true, params = {}
let rule_items = rule.split('/')
if (url_items.length != rule_items.length) continue
for (var i = 1; i < rule_items.length; i++) {
if (!check_item(rule_items[i], url_items[i], params)) {
flag = false
break
}
}
if (flag) {
return params
}
}
throw new Error('URL CANNOT MATCH ROUTE MAP')
}
enum Method {
GET = 1,
POST = 2,
PUT = 4,
DELETE = 8,
OPTIONS = 16,
HEAD = 32,
}
interface Rule {
route: string
method: number
}
type Params = {[key: string]: string}
function check_item(rule: string, url: string, params: any): boolean {
var pos_s = rule.indexOf('{')
var pos_e = rule.indexOf('}')
if (pos_s >= 0 && pos_e) {
var r_after = rule.slice(0, pos_s)
var key = rule.slice(pos_s + 2, pos_e)
var r_be = rule.slice(pos_e + 1, rule.length)
var pos_2 = url.lastIndexOf(r_be)
var u_after = url.slice(0, pos_s)
var value = url.slice(pos_s, pos_2)
var u_be = url.slice(pos_2, url.length)
if (r_after === u_after && r_be === u_be) {
params[key] = value
return true
} else {
return false
}
} else
return rule.toLowerCase() === url.toLowerCase()
}
}
export function getParamsByRouter(url: string, method: Method, rules: Rule[]): [Method, Params] {
let url_items = url.split('/')
for (let index = 0, length = rules.length; index < length; index++) {
let rule = rules[index]
if (!(method & rule.method)) {
continue
}
let flag = true, params: Params = {}
let rule_items = rule.route.split('/')
if (url_items.length != rule_items.length) continue
for (var i = 1; i < rule_items.length; i++) {
if (!check_item(rule_items[i], url_items[i], params)) {
flag = false
break
}
}
if (flag) {
return [method, params]
}
}
throw new Error('URL CANNOT MATCH ROUTE MAP')
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment