uuid
uuid/uuid.go
Revert to UUID format. We used to hex encode the bytes from the UUID when encoding/printing it. Let's stop doing that, and use proper 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@0 | 43 newID, err := Parse(string(src.([]byte))) |
| paddy@2 | 44 if err != nil { |
| paddy@2 | 45 return err |
| paddy@2 | 46 } |
| paddy@0 | 47 *id = append((*id)[:0], newID...) |
| paddy@2 | 48 return nil |
| paddy@0 | 49 case string: |
| paddy@0 | 50 newID, err := Parse(src.(string)) |
| paddy@2 | 51 if err != nil { |
| paddy@2 | 52 return err |
| paddy@2 | 53 } |
| paddy@0 | 54 *id = append((*id)[:0], newID...) |
| paddy@2 | 55 return nil |
| paddy@0 | 56 default: |
| paddy@0 | 57 return InvalidIDError |
| paddy@0 | 58 } |
| paddy@0 | 59 return nil |
| paddy@0 | 60 } |
| paddy@0 | 61 |
| paddy@0 | 62 func (id *ID) UnmarshalJSON(in []byte) error { |
| paddy@0 | 63 var tmp string |
| paddy@0 | 64 err := json.Unmarshal(in, &tmp) |
| paddy@0 | 65 if err != nil { |
| paddy@0 | 66 return err |
| paddy@0 | 67 } |
| paddy@0 | 68 newID, err := Parse(tmp) |
| paddy@0 | 69 if err != nil { |
| paddy@0 | 70 return err |
| paddy@0 | 71 } |
| paddy@0 | 72 *id = append((*id)[:0], newID...) |
| paddy@0 | 73 return nil |
| paddy@0 | 74 } |
| paddy@0 | 75 |
| paddy@1 | 76 func (id *ID) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { |
| paddy@1 | 77 var tmp string |
| paddy@1 | 78 err := d.DecodeElement(&tmp, &start) |
| paddy@1 | 79 if err != nil { |
| paddy@1 | 80 return err |
| paddy@1 | 81 } |
| paddy@1 | 82 newID, err := Parse(tmp) |
| paddy@1 | 83 if err != nil { |
| paddy@1 | 84 return err |
| paddy@1 | 85 } |
| paddy@1 | 86 *id = append((*id)[:0], newID...) |
| paddy@1 | 87 return nil |
| paddy@1 | 88 } |
| paddy@1 | 89 |
| paddy@0 | 90 func Parse(in string) (ID, error) { |
| paddy@2 | 91 id := ID(uuid.Parse(in)) |
| paddy@2 | 92 if id == nil { |
| paddy@2 | 93 return id, InvalidIDError |
| paddy@0 | 94 } |
| paddy@2 | 95 return id, nil |
| paddy@0 | 96 } |
| paddy@0 | 97 |
| paddy@0 | 98 func (id ID) Equal(other ID) bool { |
| paddy@0 | 99 return uuid.Equal(uuid.UUID(id), uuid.UUID(other)) |
| paddy@0 | 100 } |