github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/service/api/server/route.go (about) 1 package server 2 3 import ( 4 "path" 5 "regexp" 6 "strings" 7 ) 8 9 var ( 10 proxyRe = regexp.MustCompile("^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$") 11 versionRe = regexp.MustCompilePOSIX("^v[0-9]+$") 12 ) 13 14 // Translates /foo/bar/zool into api service micro.api.foo method Bar.Zool 15 // Translates /foo/bar into api service micro.api.foo method Foo.Bar 16 func apiRoute(p string) (string, string) { 17 p = path.Clean(p) 18 p = strings.TrimPrefix(p, "/") 19 parts := strings.Split(p, "/") 20 21 // if we have 1 part assume name Name.Call 22 if len(parts) == 1 && len(parts[0]) > 0 { 23 return parts[0], methodName(append(parts, "Call")) 24 } 25 26 // If we've got two or less parts 27 // Use first part as service 28 // Use all parts as method 29 if len(parts) <= 2 { 30 name := parts[0] 31 return name, methodName(parts) 32 } 33 34 // Treat /v[0-9]+ as versioning where we have 3 parts 35 // /v1/foo/bar => service: v1.foo method: Foo.bar 36 if len(parts) == 3 && versionRe.Match([]byte(parts[0])) { 37 name := strings.Join(parts[:len(parts)-1], ".") 38 return name, methodName(parts[len(parts)-2:]) 39 } 40 41 // Service is everything minus last two parts 42 // Method is the last two parts 43 name := strings.Join(parts[:len(parts)-2], ".") 44 return name, methodName(parts[len(parts)-2:]) 45 } 46 47 func proxyRoute(p string) string { 48 parts := strings.Split(p, "/") 49 if len(parts) < 2 { 50 return "" 51 } 52 53 var service string 54 var alias string 55 56 // /[service]/methods 57 if len(parts) > 2 { 58 // /v1/[service] 59 if versionRe.MatchString(parts[1]) { 60 service = parts[1] + "." + parts[2] 61 alias = parts[2] 62 } else { 63 service = parts[1] 64 alias = parts[1] 65 } 66 // /[service] 67 } else { 68 service = parts[1] 69 alias = parts[1] 70 } 71 72 // check service name is valid 73 if !proxyRe.MatchString(alias) { 74 return "" 75 } 76 77 return service 78 } 79 80 func methodName(parts []string) string { 81 for i, part := range parts { 82 parts[i] = toCamel(part) 83 } 84 85 return strings.Join(parts, ".") 86 } 87 88 func toCamel(s string) string { 89 words := strings.Split(s, "-") 90 var out string 91 for _, word := range words { 92 out += strings.Title(word) 93 } 94 return out 95 }