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  }