gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/registry/util.go (about)

     1  package registry
     2  
     3  func addNodes(old, neu []*Node) []*Node {
     4  	nodes := make([]*Node, len(neu))
     5  	// add all new nodes
     6  	for i, n := range neu {
     7  		node := *n
     8  		nodes[i] = &node
     9  	}
    10  
    11  	// look at old nodes
    12  	for _, o := range old {
    13  		var exists bool
    14  
    15  		// check against new nodes
    16  		for _, n := range nodes {
    17  			// ids match then skip
    18  			if o.Id == n.Id {
    19  				exists = true
    20  				break
    21  			}
    22  		}
    23  
    24  		// keep old node
    25  		if !exists {
    26  			node := *o
    27  			nodes = append(nodes, &node)
    28  		}
    29  	}
    30  
    31  	return nodes
    32  }
    33  
    34  func delNodes(old, del []*Node) []*Node {
    35  	var nodes []*Node
    36  	for _, o := range old {
    37  		var rem bool
    38  		for _, n := range del {
    39  			if o.Id == n.Id {
    40  				rem = true
    41  				break
    42  			}
    43  		}
    44  		if !rem {
    45  			nodes = append(nodes, o)
    46  		}
    47  	}
    48  	return nodes
    49  }
    50  
    51  // CopyService make a copy of service
    52  func CopyService(service *Service) *Service {
    53  	// copy service
    54  	s := new(Service)
    55  	*s = *service
    56  
    57  	// copy nodes
    58  	nodes := make([]*Node, len(service.Nodes))
    59  	for j, node := range service.Nodes {
    60  		n := new(Node)
    61  		*n = *node
    62  		nodes[j] = n
    63  	}
    64  	s.Nodes = nodes
    65  
    66  	// copy endpoints
    67  	eps := make([]*Endpoint, len(service.Endpoints))
    68  	for j, ep := range service.Endpoints {
    69  		e := new(Endpoint)
    70  		*e = *ep
    71  		eps[j] = e
    72  	}
    73  	s.Endpoints = eps
    74  	return s
    75  }
    76  
    77  // Copy makes a copy of services
    78  func Copy(current []*Service) []*Service {
    79  	services := make([]*Service, len(current))
    80  	for i, service := range current {
    81  		services[i] = CopyService(service)
    82  	}
    83  	return services
    84  }
    85  
    86  // Merge merges two lists of services and returns a new copy
    87  func Merge(olist []*Service, nlist []*Service) []*Service {
    88  	var srv []*Service
    89  
    90  	for _, n := range nlist {
    91  		var seen bool
    92  		for _, o := range olist {
    93  			if o.Version == n.Version {
    94  				sp := new(Service)
    95  				// make copy
    96  				*sp = *o
    97  				// set nodes
    98  				sp.Nodes = addNodes(o.Nodes, n.Nodes)
    99  
   100  				// mark as seen
   101  				seen = true
   102  				srv = append(srv, sp)
   103  				break
   104  			} else {
   105  				sp := new(Service)
   106  				// make copy
   107  				*sp = *o
   108  				srv = append(srv, sp)
   109  			}
   110  		}
   111  		if !seen {
   112  			srv = append(srv, Copy([]*Service{n})...)
   113  		}
   114  	}
   115  	return srv
   116  }
   117  
   118  // Remove removes services and returns a new copy
   119  func Remove(old, del []*Service) []*Service {
   120  	var services []*Service
   121  
   122  	for _, o := range old {
   123  		srv := new(Service)
   124  		*srv = *o
   125  
   126  		var rem bool
   127  
   128  		for _, s := range del {
   129  			if srv.Version == s.Version {
   130  				srv.Nodes = delNodes(srv.Nodes, s.Nodes)
   131  
   132  				if len(srv.Nodes) == 0 {
   133  					rem = true
   134  				}
   135  			}
   136  		}
   137  
   138  		if !rem {
   139  			services = append(services, srv)
   140  		}
   141  	}
   142  
   143  	return services
   144  }