github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/uniter/runner/jujuc/storage-id.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package jujuc
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"gopkg.in/juju/names.v2"
     9  )
    10  
    11  // newStorageIdValue returns a gnuflag.Value for convenient parsing of storage
    12  // ids in ctx.
    13  func newStorageIdValue(ctx Context, result *names.StorageTag) (*storageIdValue, error) {
    14  	v := &storageIdValue{result: result, ctx: ctx}
    15  	if s, err := ctx.HookStorage(); err == nil {
    16  		*v.result = s.Tag()
    17  	} else if !errors.IsNotFound(err) {
    18  		return nil, errors.Trace(err)
    19  	}
    20  	return v, nil
    21  }
    22  
    23  // storageIdValue implements gnuflag.Value for use in storage commands.
    24  type storageIdValue struct {
    25  	result *names.StorageTag
    26  	ctx    Context
    27  }
    28  
    29  // String returns the current value.
    30  func (v *storageIdValue) String() string {
    31  	if *v.result == (names.StorageTag{}) {
    32  		return ""
    33  	}
    34  	return v.result.Id()
    35  }
    36  
    37  // Set interprets value as a storage id, if possible, and returns an error
    38  // if it is not known to the system. The parsed storage id will be written
    39  // to v.result.
    40  func (v *storageIdValue) Set(value string) error {
    41  	if !names.IsValidStorage(value) {
    42  		return errors.Errorf("invalid storage ID %q", value)
    43  	}
    44  	tag := names.NewStorageTag(value)
    45  	if _, err := v.ctx.Storage(tag); err != nil {
    46  		return errors.Trace(err)
    47  	}
    48  	*v.result = tag
    49  	return nil
    50  }