github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/docker/registry/image/image.go (about) 1 // Copyright 2021 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package image 5 6 import ( 7 "encoding/json" 8 9 "github.com/juju/errors" 10 "github.com/juju/version/v2" 11 ) 12 13 // ImageInfo defines image versions information. 14 type ImageInfo struct { 15 version version.Number 16 } 17 18 // AgentVersion returns the image version. 19 func (info ImageInfo) AgentVersion() version.Number { 20 return info.version 21 } 22 23 // String returns string format of the image version. 24 func (info ImageInfo) String() string { 25 return info.version.String() 26 } 27 28 // MarshalJSON implements json.Marshaler. 29 func (info ImageInfo) MarshalJSON() ([]byte, error) { 30 return json.Marshal(info.String()) 31 } 32 33 // UnmarshalJSON implements json.Unmarshaler. 34 func (info *ImageInfo) UnmarshalJSON(data []byte) (err error) { 35 var s string 36 if err = json.Unmarshal(data, &s); err != nil { 37 return err 38 } 39 if info.version, err = version.Parse(s); err != nil { 40 return errors.Trace(err) 41 } 42 return nil 43 } 44 45 // MarshalYAML implements yaml.v2.Marshaller interface. 46 func (info ImageInfo) MarshalYAML() (interface{}, error) { 47 return info.String(), nil 48 } 49 50 // UnmarshalYAML implements the yaml.Unmarshaller interface. 51 func (info *ImageInfo) UnmarshalYAML(unmarshal func(interface{}) error) error { 52 var s string 53 err := unmarshal(&s) 54 if err != nil { 55 return errors.Trace(err) 56 } 57 info.version, err = version.Parse(s) 58 if err != nil { 59 return errors.Trace(err) 60 } 61 return nil 62 } 63 64 // NewImageInfo creates an imageInfo. 65 func NewImageInfo(ver version.Number) ImageInfo { 66 return ImageInfo{version: ver} 67 }