To close this chapter off with a bang, we will implement a mechanism in which each Avatar
implementation takes a turn in trying to get the value. If the first implementation returns the ErrNoAvatarURL
error, we will try the next and so on until we find a useable value.
In avatar.go
, underneath the Avatar
type, add the following type definition:
type TryAvatars []Avatar
The TryAvatars
type is simply a slice of Avatar
objects; therefore, we will add the following GetAvatarURL
method:
func (a TryAvatars) GetAvatarURL(u ChatUser) (string, error) { for _, avatar := range a { if url, err := avatar.GetAvatarURL(u); err == nil { return url, nil } } return "", ErrNoAvatarURL }
This means that TryAvatars
is now a valid Avatar
implementation and can be used in place of any specific implementation. In the preceding method, we iterated over the slice of Avatar
objects in an order, calling GetAvatarURL
for each one. If no error is returned, we return...