Combining all three implementations
To close this chapter with a bang, we will implement a mechanism in which each Avatar
implementation takes a turn in trying to get a URL for a user. 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 that we are free to add methods to. Let's 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...