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.
1 package uuid
3 import (
4 "database/sql/driver"
5 "encoding/json"
6 "encoding/xml"
7 "errors"
9 "code.google.com/p/go-uuid/uuid"
10 )
12 var InvalidIDError = errors.New("Invalid ID format.")
14 type ID uuid.UUID
16 func NewID() ID {
17 return ID(uuid.NewRandom())
18 }
20 func (id ID) String() string {
21 return uuid.UUID(id).String()
22 }
24 func (id ID) MarshalJSON() ([]byte, error) {
25 return json.Marshal(id.String())
26 }
28 func (id ID) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
29 return e.EncodeElement(id.String(), start)
30 }
32 func (id ID) Value() (driver.Value, error) {
33 return id.String(), nil
34 }
36 func (id *ID) Scan(src interface{}) error {
37 if src == nil {
38 id = nil
39 return nil
40 }
41 switch src.(type) {
42 case []byte:
43 newID, err := Parse(string(src.([]byte)))
44 if err != nil {
45 return err
46 }
47 *id = append((*id)[:0], newID...)
48 return nil
49 case string:
50 newID, err := Parse(src.(string))
51 if err != nil {
52 return err
53 }
54 *id = append((*id)[:0], newID...)
55 return nil
56 default:
57 return InvalidIDError
58 }
59 return nil
60 }
62 func (id *ID) UnmarshalJSON(in []byte) error {
63 var tmp string
64 err := json.Unmarshal(in, &tmp)
65 if err != nil {
66 return err
67 }
68 newID, err := Parse(tmp)
69 if err != nil {
70 return err
71 }
72 *id = append((*id)[:0], newID...)
73 return nil
74 }
76 func (id *ID) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
77 var tmp string
78 err := d.DecodeElement(&tmp, &start)
79 if err != nil {
80 return err
81 }
82 newID, err := Parse(tmp)
83 if err != nil {
84 return err
85 }
86 *id = append((*id)[:0], newID...)
87 return nil
88 }
90 func Parse(in string) (ID, error) {
91 id := ID(uuid.Parse(in))
92 if id == nil {
93 return id, InvalidIDError
94 }
95 return id, nil
96 }
98 func (id ID) Equal(other ID) bool {
99 return uuid.Equal(uuid.UUID(id), uuid.UUID(other))
100 }