1package discovery // import "github.com/docker/docker/pkg/discovery"
2
3import "net"
4
5// NewEntry creates a new entry.
6func NewEntry(url string) (*Entry, error) {
7	host, port, err := net.SplitHostPort(url)
8	if err != nil {
9		return nil, err
10	}
11	return &Entry{host, port}, nil
12}
13
14// An Entry represents a host.
15type Entry struct {
16	Host string
17	Port string
18}
19
20// Equals returns true if cmp contains the same data.
21func (e *Entry) Equals(cmp *Entry) bool {
22	return e.Host == cmp.Host && e.Port == cmp.Port
23}
24
25// String returns the string form of an entry.
26func (e *Entry) String() string {
27	return net.JoinHostPort(e.Host, e.Port)
28}
29
30// Entries is a list of *Entry with some helpers.
31type Entries []*Entry
32
33// Equals returns true if cmp contains the same data.
34func (e Entries) Equals(cmp Entries) bool {
35	// Check if the file has really changed.
36	if len(e) != len(cmp) {
37		return false
38	}
39	for i := range e {
40		if !e[i].Equals(cmp[i]) {
41			return false
42		}
43	}
44	return true
45}
46
47// Contains returns true if the Entries contain a given Entry.
48func (e Entries) Contains(entry *Entry) bool {
49	for _, curr := range e {
50		if curr.Equals(entry) {
51			return true
52		}
53	}
54	return false
55}
56
57// Diff compares two entries and returns the added and removed entries.
58func (e Entries) Diff(cmp Entries) (Entries, Entries) {
59	added := Entries{}
60	for _, entry := range cmp {
61		if !e.Contains(entry) {
62			added = append(added, entry)
63		}
64	}
65
66	removed := Entries{}
67	for _, entry := range e {
68		if !cmp.Contains(entry) {
69			removed = append(removed, entry)
70		}
71	}
72
73	return added, removed
74}
75
76// CreateEntries returns an array of entries based on the given addresses.
77func CreateEntries(addrs []string) (Entries, error) {
78	entries := Entries{}
79	if addrs == nil {
80		return entries, nil
81	}
82
83	for _, addr := range addrs {
84		if len(addr) == 0 {
85			continue
86		}
87		entry, err := NewEntry(addr)
88		if err != nil {
89			return nil, err
90		}
91		entries = append(entries, entry)
92	}
93	return entries, nil
94}
95