gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/api/resolver/micro/route.go (about)

     1  package micro
     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 go.micro.api.foo method Bar.Zool
    15  // Translates /foo/bar into api service go.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've got two or less parts
    22  	// Use first part as service
    23  	// Use all parts as method
    24  	if len(parts) <= 2 {
    25  		name := parts[0]
    26  		return name, methodName(parts)
    27  	}
    28  
    29  	// Treat /v[0-9]+ as versioning where we have 3 parts
    30  	// /v1/foo/bar => service: v1.foo method: Foo.bar
    31  	if len(parts) == 3 && versionRe.Match([]byte(parts[0])) {
    32  		name := strings.Join(parts[:len(parts)-1], ".")
    33  		return name, methodName(parts[len(parts)-2:])
    34  	}
    35  
    36  	// Service is everything minus last two parts
    37  	// Method is the last two parts
    38  	name := strings.Join(parts[:len(parts)-2], ".")
    39  	return name, methodName(parts[len(parts)-2:])
    40  }
    41  
    42  func proxyRoute(p string) string {
    43  	parts := strings.Split(p, "/")
    44  	if len(parts) < 2 {
    45  		return ""
    46  	}
    47  
    48  	var service string
    49  	var alias string
    50  
    51  	// /[service]/methods
    52  	if len(parts) > 2 {
    53  		// /v1/[service]
    54  		if versionRe.MatchString(parts[1]) {
    55  			service = parts[1] + "." + parts[2]
    56  			alias = parts[2]
    57  		} else {
    58  			service = parts[1]
    59  			alias = parts[1]
    60  		}
    61  		// /[service]
    62  	} else {
    63  		service = parts[1]
    64  		alias = parts[1]
    65  	}
    66  
    67  	// check service name is valid
    68  	if !proxyRe.MatchString(alias) {
    69  		return ""
    70  	}
    71  
    72  	return service
    73  }
    74  
    75  func methodName(parts []string) string {
    76  	for i, part := range parts {
    77  		parts[i] = toCamel(part)
    78  	}
    79  
    80  	return strings.Join(parts, ".")
    81  }
    82  
    83  func toCamel(s string) string {
    84  	words := strings.Split(s, "-")
    85  	var out string
    86  	for _, word := range words {
    87  		out += strings.Title(word)
    88  	}
    89  	return out
    90  }