package registry import ( "strings" "github.com/docker/distribution/digest" ) // Reference represents a tag or digest within a repository type Reference interface { // HasDigest returns whether the reference has a verifiable // content addressable reference which may be considered secure. HasDigest() bool // ImageName returns an image name for the given repository ImageName(string) string // Returns a string representation of the reference String() string } type tagReference struct { tag string } func (tr tagReference) HasDigest() bool { return false } func (tr tagReference) ImageName(repo string) string { return repo + ":" + tr.tag } func (tr tagReference) String() string { return tr.tag } type digestReference struct { digest digest.Digest } func (dr digestReference) HasDigest() bool { return true } func (dr digestReference) ImageName(repo string) string { return repo + "@" + dr.String() } func (dr digestReference) String() string { return dr.digest.String() } // ParseReference parses a reference into either a digest or tag reference func ParseReference(ref string) Reference { if strings.Contains(ref, ":") { dgst, err := digest.ParseDigest(ref) if err == nil { return digestReference{digest: dgst} } } return tagReference{tag: ref} } // DigestReference creates a digest reference using a digest func DigestReference(dgst digest.Digest) Reference { return digestReference{digest: dgst} }