uuid
uuid/uuid.go
Support XML marshaling/unmarshaling. Because why not? Just implement the methods necessary for XML support.
| 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 } |