Blame vendor/github.com/google/uuid/uuid.go

Packit Service 4d2de5
// Copyright 2018 Google Inc.  All rights reserved.
Packit Service 4d2de5
// Use of this source code is governed by a BSD-style
Packit Service 4d2de5
// license that can be found in the LICENSE file.
Packit Service 4d2de5
Packit Service 4d2de5
package uuid
Packit Service 4d2de5
Packit Service 4d2de5
import (
Packit Service 4d2de5
	"bytes"
Packit Service 4d2de5
	"crypto/rand"
Packit Service 4d2de5
	"encoding/hex"
Packit Service 4d2de5
	"errors"
Packit Service 4d2de5
	"fmt"
Packit Service 4d2de5
	"io"
Packit Service 4d2de5
	"strings"
Packit Service 4d2de5
)
Packit Service 4d2de5
Packit Service 4d2de5
// A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC
Packit Service 4d2de5
// 4122.
Packit Service 4d2de5
type UUID [16]byte
Packit Service 4d2de5
Packit Service 4d2de5
// A Version represents a UUID's version.
Packit Service 4d2de5
type Version byte
Packit Service 4d2de5
Packit Service 4d2de5
// A Variant represents a UUID's variant.
Packit Service 4d2de5
type Variant byte
Packit Service 4d2de5
Packit Service 4d2de5
// Constants returned by Variant.
Packit Service 4d2de5
const (
Packit Service 4d2de5
	Invalid   = Variant(iota) // Invalid UUID
Packit Service 4d2de5
	RFC4122                   // The variant specified in RFC4122
Packit Service 4d2de5
	Reserved                  // Reserved, NCS backward compatibility.
Packit Service 4d2de5
	Microsoft                 // Reserved, Microsoft Corporation backward compatibility.
Packit Service 4d2de5
	Future                    // Reserved for future definition.
Packit Service 4d2de5
)
Packit Service 4d2de5
Packit Service 4d2de5
var rander = rand.Reader // random function
Packit Service 4d2de5
Packit Service 4d2de5
// Parse decodes s into a UUID or returns an error.  Both the standard UUID
Packit Service 4d2de5
// forms of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and
Packit Service 4d2de5
// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded as well as the
Packit Service 4d2de5
// Microsoft encoding {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} and the raw hex
Packit Service 4d2de5
// encoding: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Packit Service 4d2de5
func Parse(s string) (UUID, error) {
Packit Service 4d2de5
	var uuid UUID
Packit Service 4d2de5
	switch len(s) {
Packit Service 4d2de5
	// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Packit Service 4d2de5
	case 36:
Packit Service 4d2de5
Packit Service 4d2de5
	// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Packit Service 4d2de5
	case 36 + 9:
Packit Service 4d2de5
		if strings.ToLower(s[:9]) != "urn:uuid:" {
Packit Service 4d2de5
			return uuid, fmt.Errorf("invalid urn prefix: %q", s[:9])
Packit Service 4d2de5
		}
Packit Service 4d2de5
		s = s[9:]
Packit Service 4d2de5
Packit Service 4d2de5
	// {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
Packit Service 4d2de5
	case 36 + 2:
Packit Service 4d2de5
		s = s[1:]
Packit Service 4d2de5
Packit Service 4d2de5
	// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Packit Service 4d2de5
	case 32:
Packit Service 4d2de5
		var ok bool
Packit Service 4d2de5
		for i := range uuid {
Packit Service 4d2de5
			uuid[i], ok = xtob(s[i*2], s[i*2+1])
Packit Service 4d2de5
			if !ok {
Packit Service 4d2de5
				return uuid, errors.New("invalid UUID format")
Packit Service 4d2de5
			}
Packit Service 4d2de5
		}
Packit Service 4d2de5
		return uuid, nil
Packit Service 4d2de5
	default:
Packit Service 4d2de5
		return uuid, fmt.Errorf("invalid UUID length: %d", len(s))
Packit Service 4d2de5
	}
Packit Service 4d2de5
	// s is now at least 36 bytes long
Packit Service 4d2de5
	// it must be of the form  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Packit Service 4d2de5
	if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' {
Packit Service 4d2de5
		return uuid, errors.New("invalid UUID format")
Packit Service 4d2de5
	}
Packit Service 4d2de5
	for i, x := range [16]int{
Packit Service 4d2de5
		0, 2, 4, 6,
Packit Service 4d2de5
		9, 11,
Packit Service 4d2de5
		14, 16,
Packit Service 4d2de5
		19, 21,
Packit Service 4d2de5
		24, 26, 28, 30, 32, 34} {
Packit Service 4d2de5
		v, ok := xtob(s[x], s[x+1])
Packit Service 4d2de5
		if !ok {
Packit Service 4d2de5
			return uuid, errors.New("invalid UUID format")
Packit Service 4d2de5
		}
Packit Service 4d2de5
		uuid[i] = v
Packit Service 4d2de5
	}
Packit Service 4d2de5
	return uuid, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// ParseBytes is like Parse, except it parses a byte slice instead of a string.
Packit Service 4d2de5
func ParseBytes(b []byte) (UUID, error) {
Packit Service 4d2de5
	var uuid UUID
Packit Service 4d2de5
	switch len(b) {
Packit Service 4d2de5
	case 36: // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Packit Service 4d2de5
	case 36 + 9: // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Packit Service 4d2de5
		if !bytes.Equal(bytes.ToLower(b[:9]), []byte("urn:uuid:")) {
Packit Service 4d2de5
			return uuid, fmt.Errorf("invalid urn prefix: %q", b[:9])
Packit Service 4d2de5
		}
Packit Service 4d2de5
		b = b[9:]
Packit Service 4d2de5
	case 36 + 2: // {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
Packit Service 4d2de5
		b = b[1:]
Packit Service 4d2de5
	case 32: // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Packit Service 4d2de5
		var ok bool
Packit Service 4d2de5
		for i := 0; i < 32; i += 2 {
Packit Service 4d2de5
			uuid[i/2], ok = xtob(b[i], b[i+1])
Packit Service 4d2de5
			if !ok {
Packit Service 4d2de5
				return uuid, errors.New("invalid UUID format")
Packit Service 4d2de5
			}
Packit Service 4d2de5
		}
Packit Service 4d2de5
		return uuid, nil
Packit Service 4d2de5
	default:
Packit Service 4d2de5
		return uuid, fmt.Errorf("invalid UUID length: %d", len(b))
Packit Service 4d2de5
	}
Packit Service 4d2de5
	// s is now at least 36 bytes long
Packit Service 4d2de5
	// it must be of the form  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Packit Service 4d2de5
	if b[8] != '-' || b[13] != '-' || b[18] != '-' || b[23] != '-' {
Packit Service 4d2de5
		return uuid, errors.New("invalid UUID format")
Packit Service 4d2de5
	}
Packit Service 4d2de5
	for i, x := range [16]int{
Packit Service 4d2de5
		0, 2, 4, 6,
Packit Service 4d2de5
		9, 11,
Packit Service 4d2de5
		14, 16,
Packit Service 4d2de5
		19, 21,
Packit Service 4d2de5
		24, 26, 28, 30, 32, 34} {
Packit Service 4d2de5
		v, ok := xtob(b[x], b[x+1])
Packit Service 4d2de5
		if !ok {
Packit Service 4d2de5
			return uuid, errors.New("invalid UUID format")
Packit Service 4d2de5
		}
Packit Service 4d2de5
		uuid[i] = v
Packit Service 4d2de5
	}
Packit Service 4d2de5
	return uuid, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// MustParse is like Parse but panics if the string cannot be parsed.
Packit Service 4d2de5
// It simplifies safe initialization of global variables holding compiled UUIDs.
Packit Service 4d2de5
func MustParse(s string) UUID {
Packit Service 4d2de5
	uuid, err := Parse(s)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		panic(`uuid: Parse(` + s + `): ` + err.Error())
Packit Service 4d2de5
	}
Packit Service 4d2de5
	return uuid
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// FromBytes creates a new UUID from a byte slice. Returns an error if the slice
Packit Service 4d2de5
// does not have a length of 16. The bytes are copied from the slice.
Packit Service 4d2de5
func FromBytes(b []byte) (uuid UUID, err error) {
Packit Service 4d2de5
	err = uuid.UnmarshalBinary(b)
Packit Service 4d2de5
	return uuid, err
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// Must returns uuid if err is nil and panics otherwise.
Packit Service 4d2de5
func Must(uuid UUID, err error) UUID {
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		panic(err)
Packit Service 4d2de5
	}
Packit Service 4d2de5
	return uuid
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Packit Service 4d2de5
// , or "" if uuid is invalid.
Packit Service 4d2de5
func (uuid UUID) String() string {
Packit Service 4d2de5
	var buf [36]byte
Packit Service 4d2de5
	encodeHex(buf[:], uuid)
Packit Service 4d2de5
	return string(buf[:])
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// URN returns the RFC 2141 URN form of uuid,
Packit Service 4d2de5
// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,  or "" if uuid is invalid.
Packit Service 4d2de5
func (uuid UUID) URN() string {
Packit Service 4d2de5
	var buf [36 + 9]byte
Packit Service 4d2de5
	copy(buf[:], "urn:uuid:")
Packit Service 4d2de5
	encodeHex(buf[9:], uuid)
Packit Service 4d2de5
	return string(buf[:])
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func encodeHex(dst []byte, uuid UUID) {
Packit Service 4d2de5
	hex.Encode(dst, uuid[:4])
Packit Service 4d2de5
	dst[8] = '-'
Packit Service 4d2de5
	hex.Encode(dst[9:13], uuid[4:6])
Packit Service 4d2de5
	dst[13] = '-'
Packit Service 4d2de5
	hex.Encode(dst[14:18], uuid[6:8])
Packit Service 4d2de5
	dst[18] = '-'
Packit Service 4d2de5
	hex.Encode(dst[19:23], uuid[8:10])
Packit Service 4d2de5
	dst[23] = '-'
Packit Service 4d2de5
	hex.Encode(dst[24:], uuid[10:])
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// Variant returns the variant encoded in uuid.
Packit Service 4d2de5
func (uuid UUID) Variant() Variant {
Packit Service 4d2de5
	switch {
Packit Service 4d2de5
	case (uuid[8] & 0xc0) == 0x80:
Packit Service 4d2de5
		return RFC4122
Packit Service 4d2de5
	case (uuid[8] & 0xe0) == 0xc0:
Packit Service 4d2de5
		return Microsoft
Packit Service 4d2de5
	case (uuid[8] & 0xe0) == 0xe0:
Packit Service 4d2de5
		return Future
Packit Service 4d2de5
	default:
Packit Service 4d2de5
		return Reserved
Packit Service 4d2de5
	}
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// Version returns the version of uuid.
Packit Service 4d2de5
func (uuid UUID) Version() Version {
Packit Service 4d2de5
	return Version(uuid[6] >> 4)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (v Version) String() string {
Packit Service 4d2de5
	if v > 15 {
Packit Service 4d2de5
		return fmt.Sprintf("BAD_VERSION_%d", v)
Packit Service 4d2de5
	}
Packit Service 4d2de5
	return fmt.Sprintf("VERSION_%d", v)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (v Variant) String() string {
Packit Service 4d2de5
	switch v {
Packit Service 4d2de5
	case RFC4122:
Packit Service 4d2de5
		return "RFC4122"
Packit Service 4d2de5
	case Reserved:
Packit Service 4d2de5
		return "Reserved"
Packit Service 4d2de5
	case Microsoft:
Packit Service 4d2de5
		return "Microsoft"
Packit Service 4d2de5
	case Future:
Packit Service 4d2de5
		return "Future"
Packit Service 4d2de5
	case Invalid:
Packit Service 4d2de5
		return "Invalid"
Packit Service 4d2de5
	}
Packit Service 4d2de5
	return fmt.Sprintf("BadVariant%d", int(v))
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// SetRand sets the random number generator to r, which implements io.Reader.
Packit Service 4d2de5
// If r.Read returns an error when the package requests random data then
Packit Service 4d2de5
// a panic will be issued.
Packit Service 4d2de5
//
Packit Service 4d2de5
// Calling SetRand with nil sets the random number generator to the default
Packit Service 4d2de5
// generator.
Packit Service 4d2de5
func SetRand(r io.Reader) {
Packit Service 4d2de5
	if r == nil {
Packit Service 4d2de5
		rander = rand.Reader
Packit Service 4d2de5
		return
Packit Service 4d2de5
	}
Packit Service 4d2de5
	rander = r
Packit Service 4d2de5
}