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  }