package etcd import ( "encoding/json" "errors" "fmt" "strings" "google.golang.org/grpc/resolver" ) // Server registry format type Server struct { Name string `json:"name"` Addr string `json:"addr"` // 地址 Attrs map[string]string `json:"attrs"` // attributes } func SplitPath(path string) (Server, error) { server := Server{} strs := strings.Split(path, "/") if len(strs) == 0 { return server, errors.New("invalid path") } server.Addr = strs[len(strs)-1] return server, nil } // Exist helper function func Exist(l []resolver.Address, addr resolver.Address) bool { for i := range l { if l[i].Addr == addr.Addr { return true } } return false } // Remove helper function func Remove(s []resolver.Address, addr resolver.Address) ([]resolver.Address, bool) { for i := range s { if s[i].Addr == addr.Addr { s[i] = s[len(s)-1] return s[:len(s)-1], true } } return nil, false } func BuildResolverUrl(app string) string { return "etcd:///" + app } func BuildPrefix(server Server) string { return fmt.Sprintf("/%s/", server.Name) } func BuildRegisterPath(server Server) string { return fmt.Sprintf("%s%s", BuildPrefix(server), server.Addr) } func ParseValue(value []byte) (Server, error) { server := Server{} if err := json.Unmarshal(value, &server); err != nil { return server, err } return server, nil }