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.
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 if len(src.([]byte)) == 0 {
44 *id = (*id)[:0]
45 return nil
46 }
47 newID, err := Parse(string(src.([]byte)))
48 if err != nil {
49 return err
50 }
51 *id = append((*id)[:0], newID...)
52 return nil
53 case string:
54 if len(src.(string)) == 0 {
55 *id = (*id)[:0]
56 return nil
57 }
58 newID, err := Parse(src.(string))
59 if err != nil {
60 return err
61 }
62 *id = append((*id)[:0], newID...)
63 return nil
64 default:
65 return InvalidIDError
66 }
67 return nil
68 }
70 func (id *ID) UnmarshalJSON(in []byte) error {
71 var tmp string
72 err := json.Unmarshal(in, &tmp)
73 if err != nil {
74 return err
75 }
76 newID, err := Parse(tmp)
77 if err != nil {
78 return err
79 }
80 *id = append((*id)[:0], newID...)
81 return nil
82 }
84 func (id *ID) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
85 var tmp string
86 err := d.DecodeElement(&tmp, &start)
87 if err != nil {
88 return err
89 }
90 newID, err := Parse(tmp)
91 if err != nil {
92 return err
93 }
94 *id = append((*id)[:0], newID...)
95 return nil
96 }
98 func Parse(in string) (ID, error) {
99 id := ID(uuid.Parse(in))
100 if id == nil {
101 return id, InvalidIDError
102 }
103 return id, nil
104 }
106 func (id ID) Equal(other ID) bool {
107 return uuid.Equal(uuid.UUID(id), uuid.UUID(other))
108 }