uuid
uuid/uuid.go
When given empty input, return an empty uuid. If we're given empty input while creating a UUID, we should return an empty UUID.
| paddy@0 | 1 package uuid |
| paddy@0 | 2 |
| paddy@0 | 3 import ( |
| paddy@0 | 4 "database/sql/driver" |
| paddy@0 | 5 "encoding/json" |
| paddy@1 | 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@2 | 20 func (id ID) String() string { |
| paddy@2 | 21 return uuid.UUID(id).String() |
| paddy@2 | 22 } |
| paddy@2 | 23 |
| paddy@0 | 24 func (id ID) MarshalJSON() ([]byte, error) { |
| paddy@0 | 25 return json.Marshal(id.String()) |
| paddy@0 | 26 } |
| paddy@0 | 27 |
| paddy@1 | 28 func (id ID) MarshalXML(e *xml.Encoder, start xml.StartElement) error { |
| paddy@1 | 29 return e.EncodeElement(id.String(), start) |
| paddy@1 | 30 } |
| paddy@1 | 31 |
| paddy@0 | 32 func (id ID) Value() (driver.Value, error) { |
| paddy@0 | 33 return id.String(), nil |
| paddy@0 | 34 } |
| paddy@0 | 35 |
| paddy@0 | 36 func (id *ID) Scan(src interface{}) error { |
| paddy@0 | 37 if src == nil { |
| paddy@0 | 38 id = nil |
| paddy@0 | 39 return nil |
| paddy@0 | 40 } |
| paddy@0 | 41 switch src.(type) { |
| paddy@0 | 42 case []byte: |
| paddy@3 | 43 if len(src.([]byte)) == 0 { |
| paddy@3 | 44 *id = (*id)[:0] |
| paddy@3 | 45 return nil |
| paddy@3 | 46 } |
| paddy@0 | 47 newID, err := Parse(string(src.([]byte))) |
| paddy@2 | 48 if err != nil { |
| paddy@2 | 49 return err |
| paddy@2 | 50 } |
| paddy@0 | 51 *id = append((*id)[:0], newID...) |
| paddy@2 | 52 return nil |
| paddy@0 | 53 case string: |
| paddy@3 | 54 if len(src.(string)) == 0 { |
| paddy@3 | 55 *id = (*id)[:0] |
| paddy@3 | 56 return nil |
| paddy@3 | 57 } |
| paddy@0 | 58 newID, err := Parse(src.(string)) |
| paddy@2 | 59 if err != nil { |
| paddy@2 | 60 return err |
| paddy@2 | 61 } |
| paddy@0 | 62 *id = append((*id)[:0], newID...) |
| paddy@2 | 63 return nil |
| paddy@0 | 64 default: |
| paddy@0 | 65 return InvalidIDError |
| paddy@0 | 66 } |
| paddy@0 | 67 return nil |
| paddy@0 | 68 } |
| paddy@0 | 69 |
| paddy@0 | 70 func (id *ID) UnmarshalJSON(in []byte) error { |
| paddy@0 | 71 var tmp string |
| paddy@0 | 72 err := json.Unmarshal(in, &tmp) |
| paddy@0 | 73 if err != nil { |
| paddy@0 | 74 return err |
| paddy@0 | 75 } |
| paddy@0 | 76 newID, err := Parse(tmp) |
| paddy@0 | 77 if err != nil { |
| paddy@0 | 78 return err |
| paddy@0 | 79 } |
| paddy@0 | 80 *id = append((*id)[:0], newID...) |
| paddy@0 | 81 return nil |
| paddy@0 | 82 } |
| paddy@0 | 83 |
| paddy@1 | 84 func (id *ID) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { |
| paddy@1 | 85 var tmp string |
| paddy@1 | 86 err := d.DecodeElement(&tmp, &start) |
| paddy@1 | 87 if err != nil { |
| paddy@1 | 88 return err |
| paddy@1 | 89 } |
| paddy@1 | 90 newID, err := Parse(tmp) |
| paddy@1 | 91 if err != nil { |
| paddy@1 | 92 return err |
| paddy@1 | 93 } |
| paddy@1 | 94 *id = append((*id)[:0], newID...) |
| paddy@1 | 95 return nil |
| paddy@1 | 96 } |
| paddy@1 | 97 |
| paddy@0 | 98 func Parse(in string) (ID, error) { |
| paddy@2 | 99 id := ID(uuid.Parse(in)) |
| paddy@2 | 100 if id == nil { |
| paddy@2 | 101 return id, InvalidIDError |
| paddy@0 | 102 } |
| paddy@2 | 103 return id, nil |
| paddy@0 | 104 } |
| paddy@0 | 105 |
| paddy@0 | 106 func (id ID) Equal(other ID) bool { |
| paddy@0 | 107 return uuid.Equal(uuid.UUID(id), uuid.UUID(other)) |
| paddy@0 | 108 } |