// Create path pattern from HTTP verb and request path func toPattern(verb, path string) *gen.PathPattern { pattern := gen.PathPattern{ HTTPMethod: verb, Path: path, Pattern: pathVariablesRegexp.ReplaceAllLiteralString(path, "/%s"), Regexp: pathVariablesRegexp.ReplaceAllLiteralString(regexp.QuoteMeta(path), `/([^/]+)`), } matches := pathVariablesRegexp.FindAllStringSubmatch(path, -1) if len(matches) > 0 { pattern.Variables = make([]string, len(matches)) for i, m := range matches { pattern.Variables[i] = m[1] } } return &pattern }
// ParseRoute parses a API 1.5 route and returns corresponding path patterns. func ParseRoute(moniker string, route string) (pathPatterns []*gen.PathPattern) { // :(((( some routes are empty var paths []string var method string switch moniker { case "Deployments#servers": method, paths = "GET", []string{"/api/deployments/:id/servers"} case "ServerArrays#current_instances": method, paths = "GET", []string{"/api/server_arrays/:id/current_instances"} case "ServerArrays#launch": method, paths = "POST", []string{"/api/server_arrays/:id/launch"} case "ServerArrays#multi_run_executable": method, paths = "POST", []string{"/api/server_arrays/:id/multi_run_executable"} case "ServerArrays#multi_terminate": method, paths = "POST", []string{"/api/server_arrays/:id/multi_terminate"} case "Servers#launch": method, paths = "POST", []string{"/api/servers/:id/launch"} case "Servers#terminate": method, paths = "POST", []string{"/api/servers/:id/terminate"} default: bounds := routeRegexp.FindAllStringIndex(route, -1) matches := make([]string, len(bounds)) prev := 0 for i, bound := range bounds { matches[i] = route[prev:bound[0]] prev = bound[1] } method = strings.TrimRight(matches[0][0:7], " ") paths = make([]string, len(bounds)) j := 0 for _, r := range matches { path := strings.TrimRight(r[7:], " ") path = strings.TrimSuffix(path, "(.:format)?") if isDeprecated(path) || isCustom(method, path) { continue } paths[j] = path j++ } paths = paths[:j] } pathPatterns = make([]*gen.PathPattern, len(paths)) for i, p := range paths { rx := routeVariablesRegexp.ReplaceAllLiteralString(regexp.QuoteMeta(p), `/([^/]+)`) rx = fmt.Sprintf("^%s$", rx) pattern := gen.PathPattern{ HTTPMethod: method, Path: p, Pattern: routeVariablesRegexp.ReplaceAllLiteralString(p, "/%s"), Regexp: rx, } matches := routeVariablesRegexp.FindAllStringSubmatch(p, -1) if len(matches) > 0 { pattern.Variables = make([]string, len(matches)) for i, m := range matches { pattern.Variables[i] = m[1] } } pathPatterns[i] = &pattern } return }