uuid
uuid/uuid.go
Support XML marshaling/unmarshaling. Because why not? Just implement the methods necessary for XML support.
1 package uuid
3 import (
4 "database/sql/driver"
5 "encoding/hex"
6 "encoding/json"
7 "encoding/xml"
8 "errors"
10 "code.google.com/p/go-uuid/uuid"
11 )
13 var InvalidIDError = errors.New("Invalid ID format.")
15 type ID uuid.UUID
17 func NewID() ID {
18 return ID(uuid.NewRandom())
19 }
21 func (id ID) MarshalJSON() ([]byte, error) {
22 return json.Marshal(id.String())
23 }
25 func (id ID) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
26 return e.EncodeElement(id.String(), start)
27 }
29 func (id ID) String() string {
30 return hex.EncodeToString([]byte(id))
31 }
33 func (id ID) Value() (driver.Value, error) {
34 return id.String(), nil
35 }
37 func (id *ID) Scan(src interface{}) error {
38 if src == nil {
39 id = nil
40 return nil
41 }
42 switch src.(type) {
43 case []byte:
44 newID, err := Parse(string(src.([]byte)))
45 *id = append((*id)[:0], newID...)
46 return err
47 case string:
48 newID, err := Parse(src.(string))
49 *id = append((*id)[:0], newID...)
50 return err
51 default:
52 return InvalidIDError
53 }
54 return nil
55 }
57 func (id *ID) UnmarshalJSON(in []byte) error {
58 var tmp string
59 err := json.Unmarshal(in, &tmp)
60 if err != nil {
61 return err
62 }
63 newID, err := Parse(tmp)
64 if err != nil {
65 return err
66 }
67 *id = append((*id)[:0], newID...)
68 return nil
69 }
71 func (id *ID) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
72 var tmp string
73 err := d.DecodeElement(&tmp, &start)
74 if err != nil {
75 return err
76 }
77 newID, err := Parse(tmp)
78 if err != nil {
79 return err
80 }
81 *id = append((*id)[:0], newID...)
82 return nil
83 }
85 func Parse(in string) (ID, error) {
86 b, err := hex.DecodeString(in)
87 if err != nil {
88 return nil, err
89 }
90 return ID(b), nil
91 }
93 func (id ID) Equal(other ID) bool {
94 return uuid.Equal(uuid.UUID(id), uuid.UUID(other))
95 }