uuid

Paddy 2014-12-17 Parent:55c9e35995ab Child:f095a179ce00

1:a8d80021a45f Go to Latest

uuid/uuid.go

Support XML marshaling/unmarshaling. Because why not? Just implement the methods necessary for XML support.

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