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 }