ducky/devices

Paddy 2015-11-12 Parent:b6494e1a499e

4:7bc6a84ac906 Go to Latest

ducky/devices/vendor/code.google.com/p/go-uuid/uuid/uuid.go

Minimal Memstore implementation. Create an in-memory version of the Storer that meets the minimal requirements set by our Storer tests so far.

History
1 // Copyright 2011 Google Inc. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 package uuid
7 import (
8 "bytes"
9 "crypto/rand"
10 "fmt"
11 "io"
12 "strings"
13 )
15 // A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC
16 // 4122.
17 type UUID []byte
19 // A Version represents a UUIDs version.
20 type Version byte
22 // A Variant represents a UUIDs variant.
23 type Variant byte
25 // Constants returned by Variant.
26 const (
27 Invalid = Variant(iota) // Invalid UUID
28 RFC4122 // The variant specified in RFC4122
29 Reserved // Reserved, NCS backward compatibility.
30 Microsoft // Reserved, Microsoft Corporation backward compatibility.
31 Future // Reserved for future definition.
32 )
34 var rander = rand.Reader // random function
36 // New returns a new random (version 4) UUID as a string. It is a convenience
37 // function for NewRandom().String().
38 func New() string {
39 return NewRandom().String()
40 }
42 // Parse decodes s into a UUID or returns nil. Both the UUID form of
43 // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and
44 // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded.
45 func Parse(s string) UUID {
46 if len(s) == 36+9 {
47 if strings.ToLower(s[:9]) != "urn:uuid:" {
48 return nil
49 }
50 s = s[9:]
51 } else if len(s) != 36 {
52 return nil
53 }
54 if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' {
55 return nil
56 }
57 uuid := make([]byte, 16)
58 for i, x := range []int{
59 0, 2, 4, 6,
60 9, 11,
61 14, 16,
62 19, 21,
63 24, 26, 28, 30, 32, 34} {
64 if v, ok := xtob(s[x:]); !ok {
65 return nil
66 } else {
67 uuid[i] = v
68 }
69 }
70 return uuid
71 }
73 // Equal returns true if uuid1 and uuid2 are equal.
74 func Equal(uuid1, uuid2 UUID) bool {
75 return bytes.Equal(uuid1, uuid2)
76 }
78 // String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
79 // , or "" if uuid is invalid.
80 func (uuid UUID) String() string {
81 if uuid == nil || len(uuid) != 16 {
82 return ""
83 }
84 b := []byte(uuid)
85 return fmt.Sprintf("%08x-%04x-%04x-%04x-%012x",
86 b[:4], b[4:6], b[6:8], b[8:10], b[10:])
87 }
89 // URN returns the RFC 2141 URN form of uuid,
90 // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, or "" if uuid is invalid.
91 func (uuid UUID) URN() string {
92 if uuid == nil || len(uuid) != 16 {
93 return ""
94 }
95 b := []byte(uuid)
96 return fmt.Sprintf("urn:uuid:%08x-%04x-%04x-%04x-%012x",
97 b[:4], b[4:6], b[6:8], b[8:10], b[10:])
98 }
100 // Variant returns the variant encoded in uuid. It returns Invalid if
101 // uuid is invalid.
102 func (uuid UUID) Variant() Variant {
103 if len(uuid) != 16 {
104 return Invalid
105 }
106 switch {
107 case (uuid[8] & 0xc0) == 0x80:
108 return RFC4122
109 case (uuid[8] & 0xe0) == 0xc0:
110 return Microsoft
111 case (uuid[8] & 0xe0) == 0xe0:
112 return Future
113 default:
114 return Reserved
115 }
116 panic("unreachable")
117 }
119 // Version returns the verison of uuid. It returns false if uuid is not
120 // valid.
121 func (uuid UUID) Version() (Version, bool) {
122 if len(uuid) != 16 {
123 return 0, false
124 }
125 return Version(uuid[6] >> 4), true
126 }
128 func (v Version) String() string {
129 if v > 15 {
130 return fmt.Sprintf("BAD_VERSION_%d", v)
131 }
132 return fmt.Sprintf("VERSION_%d", v)
133 }
135 func (v Variant) String() string {
136 switch v {
137 case RFC4122:
138 return "RFC4122"
139 case Reserved:
140 return "Reserved"
141 case Microsoft:
142 return "Microsoft"
143 case Future:
144 return "Future"
145 case Invalid:
146 return "Invalid"
147 }
148 return fmt.Sprintf("BadVariant%d", int(v))
149 }
151 // SetRand sets the random number generator to r, which implents io.Reader.
152 // If r.Read returns an error when the package requests random data then
153 // a panic will be issued.
154 //
155 // Calling SetRand with nil sets the random number generator to the default
156 // generator.
157 func SetRand(r io.Reader) {
158 if r == nil {
159 rander = rand.Reader
160 return
161 }
162 rander = r
163 }