github.com/demonoid81/moby@v0.0.0-20200517203328-62dd8e17c460/pkg/discovery/entry.go (about) 1 package discovery // import "github.com/demonoid81/moby/pkg/discovery" 2 3 import "net" 4 5 // NewEntry creates a new entry. 6 func 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. 15 type Entry struct { 16 Host string 17 Port string 18 } 19 20 // Equals returns true if cmp contains the same data. 21 func (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. 26 func (e *Entry) String() string { 27 return net.JoinHostPort(e.Host, e.Port) 28 } 29 30 // Entries is a list of *Entry with some helpers. 31 type Entries []*Entry 32 33 // Equals returns true if cmp contains the same data. 34 func (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. 48 func (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. 58 func (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. 77 func 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 }