uuid
2014-09-27
Child:a8d80021a45f
uuid/uuid.go
Create uuid package. The uuid package is just a small wrapper around code.google.com/p/go-uuid, to enable some helpers around marshalling/unmarshalling and encoding/decoding the UUID type.
| 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@0 | 7 "errors" |
| paddy@0 | 8 |
| paddy@0 | 9 "code.google.com/p/go-uuid/uuid" |
| paddy@0 | 10 ) |
| paddy@0 | 11 |
| paddy@0 | 12 var InvalidIDError = errors.New("Invalid ID format.") |
| paddy@0 | 13 |
| paddy@0 | 14 type ID uuid.UUID |
| paddy@0 | 15 |
| paddy@0 | 16 func NewID() ID { |
| paddy@0 | 17 return ID(uuid.NewRandom()) |
| paddy@0 | 18 } |
| paddy@0 | 19 |
| paddy@0 | 20 func (id ID) MarshalJSON() ([]byte, error) { |
| paddy@0 | 21 return json.Marshal(id.String()) |
| paddy@0 | 22 } |
| paddy@0 | 23 |
| paddy@0 | 24 func (id ID) String() string { |
| paddy@0 | 25 return hex.EncodeToString([]byte(id)) |
| paddy@0 | 26 } |
| paddy@0 | 27 |
| paddy@0 | 28 func (id ID) Value() (driver.Value, error) { |
| paddy@0 | 29 return id.String(), nil |
| paddy@0 | 30 } |
| paddy@0 | 31 |
| paddy@0 | 32 func (id *ID) Scan(src interface{}) error { |
| paddy@0 | 33 if src == nil { |
| paddy@0 | 34 id = nil |
| paddy@0 | 35 return nil |
| paddy@0 | 36 } |
| paddy@0 | 37 switch src.(type) { |
| paddy@0 | 38 case []byte: |
| paddy@0 | 39 newID, err := Parse(string(src.([]byte))) |
| paddy@0 | 40 *id = append((*id)[:0], newID...) |
| paddy@0 | 41 return err |
| paddy@0 | 42 case string: |
| paddy@0 | 43 newID, err := Parse(src.(string)) |
| paddy@0 | 44 *id = append((*id)[:0], newID...) |
| paddy@0 | 45 return err |
| paddy@0 | 46 default: |
| paddy@0 | 47 return InvalidIDError |
| paddy@0 | 48 } |
| paddy@0 | 49 return nil |
| paddy@0 | 50 } |
| paddy@0 | 51 |
| paddy@0 | 52 func (id *ID) UnmarshalJSON(in []byte) error { |
| paddy@0 | 53 var tmp string |
| paddy@0 | 54 err := json.Unmarshal(in, &tmp) |
| paddy@0 | 55 if err != nil { |
| paddy@0 | 56 return err |
| paddy@0 | 57 } |
| paddy@0 | 58 newID, err := Parse(tmp) |
| paddy@0 | 59 if err != nil { |
| paddy@0 | 60 return err |
| paddy@0 | 61 } |
| paddy@0 | 62 *id = append((*id)[:0], newID...) |
| paddy@0 | 63 return nil |
| paddy@0 | 64 } |
| paddy@0 | 65 |
| paddy@0 | 66 func Parse(in string) (ID, error) { |
| paddy@0 | 67 b, err := hex.DecodeString(in) |
| paddy@0 | 68 if err != nil { |
| paddy@0 | 69 return nil, err |
| paddy@0 | 70 } |
| paddy@0 | 71 return ID(b), nil |
| paddy@0 | 72 } |
| paddy@0 | 73 |
| paddy@0 | 74 func (id ID) Equal(other ID) bool { |
| paddy@0 | 75 return uuid.Equal(uuid.UUID(id), uuid.UUID(other)) |
| paddy@0 | 76 } |