uuid

Paddy 2014-09-27 Child:a8d80021a45f

0:55c9e35995ab Go to Latest

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.

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@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 }