github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/service/registry/cache/util.go (about) 1 // Licensed under the Apache License, Version 2.0 (the "License"); 2 // you may not use this file except in compliance with the License. 3 // You may obtain a copy of the License at 4 // 5 // https://www.apache.org/licenses/LICENSE-2.0 6 // 7 // Unless required by applicable law or agreed to in writing, software 8 // distributed under the License is distributed on an "AS IS" BASIS, 9 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 // See the License for the specific language governing permissions and 11 // limitations under the License. 12 // 13 // Original source: github.com/micro/go-micro/v3/util/registry/util.go 14 15 package cache 16 17 import ( 18 "github.com/tickoalcantara12/micro/v3/service/registry" 19 ) 20 21 func addNodes(old, neu []*registry.Node) []*registry.Node { 22 nodes := make([]*registry.Node, len(neu)) 23 // add all new nodes 24 for i, n := range neu { 25 node := *n 26 nodes[i] = &node 27 } 28 29 // look at old nodes 30 for _, o := range old { 31 var exists bool 32 33 // check against new nodes 34 for _, n := range nodes { 35 // ids match then skip 36 if o.Id == n.Id { 37 exists = true 38 break 39 } 40 } 41 42 // keep old node 43 if !exists { 44 node := *o 45 nodes = append(nodes, &node) 46 } 47 } 48 49 return nodes 50 } 51 52 func delNodes(old, del []*registry.Node) []*registry.Node { 53 var nodes []*registry.Node 54 for _, o := range old { 55 var rem bool 56 for _, n := range del { 57 if o.Id == n.Id { 58 rem = true 59 break 60 } 61 } 62 if !rem { 63 nodes = append(nodes, o) 64 } 65 } 66 return nodes 67 } 68 69 // CopyService make a copy of service 70 func CopyService(service *registry.Service) *registry.Service { 71 // copy service 72 s := new(registry.Service) 73 *s = *service 74 75 // copy nodes 76 nodes := make([]*registry.Node, len(service.Nodes)) 77 for j, node := range service.Nodes { 78 n := new(registry.Node) 79 *n = *node 80 nodes[j] = n 81 } 82 s.Nodes = nodes 83 84 // copy endpoints 85 eps := make([]*registry.Endpoint, len(service.Endpoints)) 86 for j, ep := range service.Endpoints { 87 e := new(registry.Endpoint) 88 *e = *ep 89 eps[j] = e 90 } 91 s.Endpoints = eps 92 return s 93 } 94 95 // Copy makes a copy of services 96 func Copy(current []*registry.Service) []*registry.Service { 97 services := make([]*registry.Service, len(current)) 98 for i, service := range current { 99 services[i] = CopyService(service) 100 } 101 return services 102 } 103 104 // Merge merges two lists of services and returns a new copy 105 func Merge(olist []*registry.Service, nlist []*registry.Service) []*registry.Service { 106 var srv []*registry.Service 107 108 for _, n := range nlist { 109 var seen bool 110 for _, o := range olist { 111 if o.Version == n.Version { 112 sp := new(registry.Service) 113 // make copy 114 *sp = *o 115 // set nodes 116 sp.Nodes = addNodes(o.Nodes, n.Nodes) 117 118 // mark as seen 119 seen = true 120 srv = append(srv, sp) 121 break 122 } else { 123 sp := new(registry.Service) 124 // make copy 125 *sp = *o 126 srv = append(srv, sp) 127 } 128 } 129 if !seen { 130 srv = append(srv, Copy([]*registry.Service{n})...) 131 } 132 } 133 return srv 134 } 135 136 // Remove removes services and returns a new copy 137 func Remove(old, del []*registry.Service) []*registry.Service { 138 var services []*registry.Service 139 140 for _, o := range old { 141 srv := new(registry.Service) 142 *srv = *o 143 144 var rem bool 145 146 for _, s := range del { 147 if srv.Version == s.Version { 148 srv.Nodes = delNodes(srv.Nodes, s.Nodes) 149 150 if len(srv.Nodes) == 0 { 151 rem = true 152 } 153 } 154 } 155 156 if !rem { 157 services = append(services, srv) 158 } 159 } 160 161 return services 162 }