ducky/devices

Paddy 2015-11-20 Parent:b6494e1a499e Child:a700ede02f91

9:f5a9d5f8f28d Go to Latest

ducky/devices/vendor/code.secondbit.org/uuid.hg/uuid.go

Separate out StorerFactory into its own interface. We had previously included a Factory and Destroy method in the Storer interface, but it makes more sense to separate those out into a StorerFactory interface. This lets us avoid the impression that we're using the same instance of a Storer for every test, separates the test methods away from the methods that are actually used in prod, and hides them from Godoc. What's not to like?

History
paddy@0 1 package uuid
paddy@0 2
paddy@0 3 import (
paddy@0 4 "database/sql/driver"
paddy@0 5 "encoding/json"
paddy@0 6 "encoding/xml"
paddy@0 7 "errors"
paddy@0 8
paddy@0 9 "code.google.com/p/go-uuid/uuid"
paddy@0 10 )
paddy@0 11
paddy@0 12 var InvalidIDError = errors.New("Invalid ID format.")
paddy@0 13
paddy@0 14 type ID uuid.UUID
paddy@0 15
paddy@0 16 func NewID() ID {
paddy@0 17 return ID(uuid.NewRandom())
paddy@0 18 }
paddy@0 19
paddy@0 20 func (id ID) String() string {
paddy@0 21 return uuid.UUID(id).String()
paddy@0 22 }
paddy@0 23
paddy@0 24 func (id ID) IsZero() bool {
paddy@0 25 if id == nil {
paddy@0 26 return true
paddy@0 27 }
paddy@0 28 if len(id) == 0 {
paddy@0 29 return true
paddy@0 30 }
paddy@0 31 return false
paddy@0 32 }
paddy@0 33
paddy@0 34 func (id ID) Copy() ID {
paddy@0 35 resp, _ := Parse(id.String())
paddy@0 36 // ignore the error because they asked for a copy of the ID, they
paddy@0 37 // never asked if it was valid or not.
paddy@0 38 // This is, overall, not the most efficient way to do this (we're
paddy@0 39 // essentially converting to a string and then back again) but the
paddy@0 40 // computational complexity involved is pretty minor, and it allows
paddy@0 41 // us to respect the boundaries between the packages, using only the
paddy@0 42 // exported interfaces to perform a copy. And that seems pretty
paddy@0 43 // valuable.
paddy@0 44 return resp
paddy@0 45 }
paddy@0 46
paddy@0 47 func (id ID) MarshalJSON() ([]byte, error) {
paddy@0 48 return json.Marshal(id.String())
paddy@0 49 }
paddy@0 50
paddy@0 51 func (id ID) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
paddy@0 52 return e.EncodeElement(id.String(), start)
paddy@0 53 }
paddy@0 54
paddy@0 55 func (id ID) Value() (driver.Value, error) {
paddy@0 56 return id.String(), nil
paddy@0 57 }
paddy@0 58
paddy@0 59 func (id *ID) Scan(src interface{}) error {
paddy@0 60 if src == nil {
paddy@0 61 id = nil
paddy@0 62 return nil
paddy@0 63 }
paddy@0 64 switch src.(type) {
paddy@0 65 case []byte:
paddy@0 66 if len(src.([]byte)) == 0 {
paddy@0 67 *id = (*id)[:0]
paddy@0 68 return nil
paddy@0 69 }
paddy@0 70 newID, err := Parse(string(src.([]byte)))
paddy@0 71 if err != nil {
paddy@0 72 return err
paddy@0 73 }
paddy@0 74 *id = append((*id)[:0], newID...)
paddy@0 75 return nil
paddy@0 76 case string:
paddy@0 77 if len(src.(string)) == 0 {
paddy@0 78 *id = (*id)[:0]
paddy@0 79 return nil
paddy@0 80 }
paddy@0 81 newID, err := Parse(src.(string))
paddy@0 82 if err != nil {
paddy@0 83 return err
paddy@0 84 }
paddy@0 85 *id = append((*id)[:0], newID...)
paddy@0 86 return nil
paddy@0 87 default:
paddy@0 88 return InvalidIDError
paddy@0 89 }
paddy@0 90 return nil
paddy@0 91 }
paddy@0 92
paddy@0 93 func (id *ID) UnmarshalJSON(in []byte) error {
paddy@0 94 var tmp string
paddy@0 95 err := json.Unmarshal(in, &tmp)
paddy@0 96 if err != nil {
paddy@0 97 return err
paddy@0 98 }
paddy@0 99 newID, err := Parse(tmp)
paddy@0 100 if err != nil {
paddy@0 101 return err
paddy@0 102 }
paddy@0 103 *id = append((*id)[:0], newID...)
paddy@0 104 return nil
paddy@0 105 }
paddy@0 106
paddy@0 107 func (id *ID) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
paddy@0 108 var tmp string
paddy@0 109 err := d.DecodeElement(&tmp, &start)
paddy@0 110 if err != nil {
paddy@0 111 return err
paddy@0 112 }
paddy@0 113 newID, err := Parse(tmp)
paddy@0 114 if err != nil {
paddy@0 115 return err
paddy@0 116 }
paddy@0 117 *id = append((*id)[:0], newID...)
paddy@0 118 return nil
paddy@0 119 }
paddy@0 120
paddy@0 121 func Parse(in string) (ID, error) {
paddy@0 122 id := ID(uuid.Parse(in))
paddy@0 123 if id == nil {
paddy@0 124 return id, InvalidIDError
paddy@0 125 }
paddy@0 126 return id, nil
paddy@0 127 }
paddy@0 128
paddy@0 129 func (id ID) Equal(other ID) bool {
paddy@0 130 return uuid.Equal(uuid.UUID(id), uuid.UUID(other))
paddy@0 131 }