summaryrefslogtreecommitdiff
path: root/vendor/github.com/rs
diff options
context:
space:
mode:
authorLibravatar Terin Stock <terinjokes@gmail.com>2025-03-09 17:47:56 +0100
committerLibravatar Terin Stock <terinjokes@gmail.com>2025-03-10 01:59:49 +0100
commit3ac1ee16f377d31a0fb80c8dae28b6239ac4229e (patch)
treef61faa581feaaeaba2542b9f2b8234a590684413 /vendor/github.com/rs
parent[chore] update URLs to forked source (diff)
downloadgotosocial-3ac1ee16f377d31a0fb80c8dae28b6239ac4229e.tar.xz
[chore] remove vendor
Diffstat (limited to 'vendor/github.com/rs')
-rw-r--r--vendor/github.com/rs/xid/.appveyor.yml27
-rw-r--r--vendor/github.com/rs/xid/.gitignore3
-rw-r--r--vendor/github.com/rs/xid/.golangci.yml5
-rw-r--r--vendor/github.com/rs/xid/.travis.yml8
-rw-r--r--vendor/github.com/rs/xid/LICENSE19
-rw-r--r--vendor/github.com/rs/xid/README.md121
-rw-r--r--vendor/github.com/rs/xid/error.go11
-rw-r--r--vendor/github.com/rs/xid/hostid_darwin.go34
-rw-r--r--vendor/github.com/rs/xid/hostid_fallback.go9
-rw-r--r--vendor/github.com/rs/xid/hostid_freebsd.go9
-rw-r--r--vendor/github.com/rs/xid/hostid_linux.go13
-rw-r--r--vendor/github.com/rs/xid/hostid_windows.go50
-rw-r--r--vendor/github.com/rs/xid/id.go390
13 files changed, 0 insertions, 699 deletions
diff --git a/vendor/github.com/rs/xid/.appveyor.yml b/vendor/github.com/rs/xid/.appveyor.yml
deleted file mode 100644
index c73bb33ba..000000000
--- a/vendor/github.com/rs/xid/.appveyor.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-version: 1.0.0.{build}
-
-platform: x64
-
-branches:
- only:
- - master
-
-clone_folder: c:\gopath\src\github.com\rs\xid
-
-environment:
- GOPATH: c:\gopath
-
-install:
- - echo %PATH%
- - echo %GOPATH%
- - set PATH=%GOPATH%\bin;c:\go\bin;%PATH%
- - go version
- - go env
- - go get -t .
-
-build_script:
- - go build
-
-test_script:
- - go test
-
diff --git a/vendor/github.com/rs/xid/.gitignore b/vendor/github.com/rs/xid/.gitignore
deleted file mode 100644
index 81be9277f..000000000
--- a/vendor/github.com/rs/xid/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/.idea
-/.vscode
-.DS_Store \ No newline at end of file
diff --git a/vendor/github.com/rs/xid/.golangci.yml b/vendor/github.com/rs/xid/.golangci.yml
deleted file mode 100644
index 7929600a9..000000000
--- a/vendor/github.com/rs/xid/.golangci.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-run:
- tests: false
-
-output:
- sort-results: true
diff --git a/vendor/github.com/rs/xid/.travis.yml b/vendor/github.com/rs/xid/.travis.yml
deleted file mode 100644
index b37da1594..000000000
--- a/vendor/github.com/rs/xid/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-language: go
-go:
-- "1.9"
-- "1.10"
-- "master"
-matrix:
- allow_failures:
- - go: "master"
diff --git a/vendor/github.com/rs/xid/LICENSE b/vendor/github.com/rs/xid/LICENSE
deleted file mode 100644
index 47c5e9d2d..000000000
--- a/vendor/github.com/rs/xid/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2015 Olivier Poitrey <rs@dailymotion.com>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/vendor/github.com/rs/xid/README.md b/vendor/github.com/rs/xid/README.md
deleted file mode 100644
index 1bf45bd11..000000000
--- a/vendor/github.com/rs/xid/README.md
+++ /dev/null
@@ -1,121 +0,0 @@
-# Globally Unique ID Generator
-
-[![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/rs/xid) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/rs/xid/master/LICENSE) [![Build Status](https://travis-ci.org/rs/xid.svg?branch=master)](https://travis-ci.org/rs/xid) [![Coverage](http://gocover.io/_badge/github.com/rs/xid)](http://gocover.io/github.com/rs/xid)
-
-Package xid is a globally unique id generator library, ready to safely be used directly in your server code.
-
-Xid uses the Mongo Object ID algorithm to generate globally unique ids with a different serialization ([base32hex](https://datatracker.ietf.org/doc/html/rfc4648#page-10)) to make it shorter when transported as a string:
-https://docs.mongodb.org/manual/reference/object-id/
-
-- 4-byte value representing the seconds since the Unix epoch,
-- 3-byte machine identifier,
-- 2-byte process id, and
-- 3-byte counter, starting with a random value.
-
-The binary representation of the id is compatible with Mongo 12 bytes Object IDs.
-The string representation is using [base32hex](https://datatracker.ietf.org/doc/html/rfc4648#page-10) (w/o padding) for better space efficiency
-when stored in that form (20 bytes). The hex variant of base32 is used to retain the
-sortable property of the id.
-
-Xid doesn't use base64 because case sensitivity and the 2 non alphanum chars may be an
-issue when transported as a string between various systems. Base36 wasn't retained either
-because 1/ it's not standard 2/ the resulting size is not predictable (not bit aligned)
-and 3/ it would not remain sortable. To validate a base32 `xid`, expect a 20 chars long,
-all lowercase sequence of `a` to `v` letters and `0` to `9` numbers (`[0-9a-v]{20}`).
-
-UUIDs are 16 bytes (128 bits) and 36 chars as string representation. Twitter Snowflake
-ids are 8 bytes (64 bits) but require machine/data-center configuration and/or central
-generator servers. xid stands in between with 12 bytes (96 bits) and a more compact
-URL-safe string representation (20 chars). No configuration or central generator server
-is required so it can be used directly in server's code.
-
-| Name | Binary Size | String Size | Features
-|-------------|-------------|----------------|----------------
-| [UUID] | 16 bytes | 36 chars | configuration free, not sortable
-| [shortuuid] | 16 bytes | 22 chars | configuration free, not sortable
-| [Snowflake] | 8 bytes | up to 20 chars | needs machine/DC configuration, needs central server, sortable
-| [MongoID] | 12 bytes | 24 chars | configuration free, sortable
-| xid | 12 bytes | 20 chars | configuration free, sortable
-
-[UUID]: https://en.wikipedia.org/wiki/Universally_unique_identifier
-[shortuuid]: https://github.com/stochastic-technologies/shortuuid
-[Snowflake]: https://blog.twitter.com/2010/announcing-snowflake
-[MongoID]: https://docs.mongodb.org/manual/reference/object-id/
-
-Features:
-
-- Size: 12 bytes (96 bits), smaller than UUID, larger than snowflake
-- Base32 hex encoded by default (20 chars when transported as printable string, still sortable)
-- Non configured, you don't need set a unique machine and/or data center id
-- K-ordered
-- Embedded time with 1 second precision
-- Unicity guaranteed for 16,777,216 (24 bits) unique ids per second and per host/process
-- Lock-free (i.e.: unlike UUIDv1 and v2)
-
-Best used with [zerolog](https://github.com/rs/zerolog)'s
-[RequestIDHandler](https://godoc.org/github.com/rs/zerolog/hlog#RequestIDHandler).
-
-Notes:
-
-- Xid is dependent on the system time, a monotonic counter and so is not cryptographically secure. If unpredictability of IDs is important, you should not use Xids. It is worth noting that most other UUID-like implementations are also not cryptographically secure. You should use libraries that rely on cryptographically secure sources (like /dev/urandom on unix, crypto/rand in golang), if you want a truly random ID generator.
-
-References:
-
-- http://www.slideshare.net/davegardnerisme/unique-id-generation-in-distributed-systems
-- https://en.wikipedia.org/wiki/Universally_unique_identifier
-- https://blog.twitter.com/2010/announcing-snowflake
-- Python port by [Graham Abbott](https://github.com/graham): https://github.com/graham/python_xid
-- Scala port by [Egor Kolotaev](https://github.com/kolotaev): https://github.com/kolotaev/ride
-- Rust port by [Jérôme Renard](https://github.com/jeromer/): https://github.com/jeromer/libxid
-- Ruby port by [Valar](https://github.com/valarpirai/): https://github.com/valarpirai/ruby_xid
-- Java port by [0xShamil](https://github.com/0xShamil/): https://github.com/0xShamil/java-xid
-- Dart port by [Peter Bwire](https://github.com/pitabwire): https://pub.dev/packages/xid
-- PostgreSQL port by [Rasmus Holm](https://github.com/crholm): https://github.com/modfin/pg-xid
-- Swift port by [Uditha Atukorala](https://github.com/uatuko): https://github.com/uatuko/swift-xid
-- C++ port by [Uditha Atukorala](https://github.com/uatuko): https://github.com/uatuko/libxid
-- Typescript & Javascript port by [Yiwen AI](https://github.com/yiwen-ai): https://github.com/yiwen-ai/xid-ts
-- Gleam port by [Alexandre Del Vecchio](https://github.com/defgenx): https://github.com/defgenx/gxid
-
-## Install
-
- go get github.com/rs/xid
-
-## Usage
-
-```go
-guid := xid.New()
-
-println(guid.String())
-// Output: 9m4e2mr0ui3e8a215n4g
-```
-
-Get `xid` embedded info:
-
-```go
-guid.Machine()
-guid.Pid()
-guid.Time()
-guid.Counter()
-```
-
-## Benchmark
-
-Benchmark against Go [Maxim Bublis](https://github.com/satori)'s [UUID](https://github.com/satori/go.uuid).
-
-```
-BenchmarkXID 20000000 91.1 ns/op 32 B/op 1 allocs/op
-BenchmarkXID-2 20000000 55.9 ns/op 32 B/op 1 allocs/op
-BenchmarkXID-4 50000000 32.3 ns/op 32 B/op 1 allocs/op
-BenchmarkUUIDv1 10000000 204 ns/op 48 B/op 1 allocs/op
-BenchmarkUUIDv1-2 10000000 160 ns/op 48 B/op 1 allocs/op
-BenchmarkUUIDv1-4 10000000 195 ns/op 48 B/op 1 allocs/op
-BenchmarkUUIDv4 1000000 1503 ns/op 64 B/op 2 allocs/op
-BenchmarkUUIDv4-2 1000000 1427 ns/op 64 B/op 2 allocs/op
-BenchmarkUUIDv4-4 1000000 1452 ns/op 64 B/op 2 allocs/op
-```
-
-Note: UUIDv1 requires a global lock, hence the performance degradation as we add more CPUs.
-
-## Licenses
-
-All source code is licensed under the [MIT License](https://raw.github.com/rs/xid/master/LICENSE).
diff --git a/vendor/github.com/rs/xid/error.go b/vendor/github.com/rs/xid/error.go
deleted file mode 100644
index ea2537493..000000000
--- a/vendor/github.com/rs/xid/error.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package xid
-
-const (
- // ErrInvalidID is returned when trying to unmarshal an invalid ID.
- ErrInvalidID strErr = "xid: invalid ID"
-)
-
-// strErr allows declaring errors as constants.
-type strErr string
-
-func (err strErr) Error() string { return string(err) }
diff --git a/vendor/github.com/rs/xid/hostid_darwin.go b/vendor/github.com/rs/xid/hostid_darwin.go
deleted file mode 100644
index 17351563a..000000000
--- a/vendor/github.com/rs/xid/hostid_darwin.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// +build darwin
-
-package xid
-
-import (
- "errors"
- "os/exec"
- "strings"
-)
-
-func readPlatformMachineID() (string, error) {
- ioreg, err := exec.LookPath("ioreg")
- if err != nil {
- return "", err
- }
-
- cmd := exec.Command(ioreg, "-rd1", "-c", "IOPlatformExpertDevice")
- out, err := cmd.CombinedOutput()
- if err != nil {
- return "", err
- }
-
- for _, line := range strings.Split(string(out), "\n") {
- if strings.Contains(line, "IOPlatformUUID") {
- parts := strings.SplitAfter(line, `" = "`)
- if len(parts) == 2 {
- uuid := strings.TrimRight(parts[1], `"`)
- return strings.ToLower(uuid), nil
- }
- }
- }
-
- return "", errors.New("cannot find host id")
-}
diff --git a/vendor/github.com/rs/xid/hostid_fallback.go b/vendor/github.com/rs/xid/hostid_fallback.go
deleted file mode 100644
index 7fbd3c004..000000000
--- a/vendor/github.com/rs/xid/hostid_fallback.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// +build !darwin,!linux,!freebsd,!windows
-
-package xid
-
-import "errors"
-
-func readPlatformMachineID() (string, error) {
- return "", errors.New("not implemented")
-}
diff --git a/vendor/github.com/rs/xid/hostid_freebsd.go b/vendor/github.com/rs/xid/hostid_freebsd.go
deleted file mode 100644
index be25a039e..000000000
--- a/vendor/github.com/rs/xid/hostid_freebsd.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// +build freebsd
-
-package xid
-
-import "syscall"
-
-func readPlatformMachineID() (string, error) {
- return syscall.Sysctl("kern.hostuuid")
-}
diff --git a/vendor/github.com/rs/xid/hostid_linux.go b/vendor/github.com/rs/xid/hostid_linux.go
deleted file mode 100644
index 837b20436..000000000
--- a/vendor/github.com/rs/xid/hostid_linux.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// +build linux
-
-package xid
-
-import "io/ioutil"
-
-func readPlatformMachineID() (string, error) {
- b, err := ioutil.ReadFile("/etc/machine-id")
- if err != nil || len(b) == 0 {
- b, err = ioutil.ReadFile("/sys/class/dmi/id/product_uuid")
- }
- return string(b), err
-}
diff --git a/vendor/github.com/rs/xid/hostid_windows.go b/vendor/github.com/rs/xid/hostid_windows.go
deleted file mode 100644
index a4d98ab0e..000000000
--- a/vendor/github.com/rs/xid/hostid_windows.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// +build windows
-
-package xid
-
-import (
- "fmt"
- "syscall"
- "unsafe"
-)
-
-func readPlatformMachineID() (string, error) {
- // source: https://github.com/shirou/gopsutil/blob/master/host/host_syscall.go
- var h syscall.Handle
-
- regKeyCryptoPtr, err := syscall.UTF16PtrFromString(`SOFTWARE\Microsoft\Cryptography`)
- if err != nil {
- return "", fmt.Errorf(`error reading registry key "SOFTWARE\Microsoft\Cryptography": %w`, err)
- }
-
- err = syscall.RegOpenKeyEx(syscall.HKEY_LOCAL_MACHINE, regKeyCryptoPtr, 0, syscall.KEY_READ|syscall.KEY_WOW64_64KEY, &h)
- if err != nil {
- return "", err
- }
- defer func() { _ = syscall.RegCloseKey(h) }()
-
- const syscallRegBufLen = 74 // len(`{`) + len(`abcdefgh-1234-456789012-123345456671` * 2) + len(`}`) // 2 == bytes/UTF16
- const uuidLen = 36
-
- var regBuf [syscallRegBufLen]uint16
- bufLen := uint32(syscallRegBufLen)
- var valType uint32
-
- mGuidPtr, err := syscall.UTF16PtrFromString(`MachineGuid`)
- if err != nil {
- return "", fmt.Errorf("error reading machine GUID: %w", err)
- }
-
- err = syscall.RegQueryValueEx(h, mGuidPtr, nil, &valType, (*byte)(unsafe.Pointer(&regBuf[0])), &bufLen)
- if err != nil {
- return "", fmt.Errorf("error parsing ")
- }
-
- hostID := syscall.UTF16ToString(regBuf[:])
- hostIDLen := len(hostID)
- if hostIDLen != uuidLen {
- return "", fmt.Errorf("HostID incorrect: %q\n", hostID)
- }
-
- return hostID, nil
-}
diff --git a/vendor/github.com/rs/xid/id.go b/vendor/github.com/rs/xid/id.go
deleted file mode 100644
index e88984d9f..000000000
--- a/vendor/github.com/rs/xid/id.go
+++ /dev/null
@@ -1,390 +0,0 @@
-// Package xid is a globally unique id generator suited for web scale
-//
-// Xid is using Mongo Object ID algorithm to generate globally unique ids:
-// https://docs.mongodb.org/manual/reference/object-id/
-//
-// - 4-byte value representing the seconds since the Unix epoch,
-// - 3-byte machine identifier,
-// - 2-byte process id, and
-// - 3-byte counter, starting with a random value.
-//
-// The binary representation of the id is compatible with Mongo 12 bytes Object IDs.
-// The string representation is using base32 hex (w/o padding) for better space efficiency
-// when stored in that form (20 bytes). The hex variant of base32 is used to retain the
-// sortable property of the id.
-//
-// Xid doesn't use base64 because case sensitivity and the 2 non alphanum chars may be an
-// issue when transported as a string between various systems. Base36 wasn't retained either
-// because 1/ it's not standard 2/ the resulting size is not predictable (not bit aligned)
-// and 3/ it would not remain sortable. To validate a base32 `xid`, expect a 20 chars long,
-// all lowercase sequence of `a` to `v` letters and `0` to `9` numbers (`[0-9a-v]{20}`).
-//
-// UUID is 16 bytes (128 bits), snowflake is 8 bytes (64 bits), xid stands in between
-// with 12 bytes with a more compact string representation ready for the web and no
-// required configuration or central generation server.
-//
-// Features:
-//
-// - Size: 12 bytes (96 bits), smaller than UUID, larger than snowflake
-// - Base32 hex encoded by default (16 bytes storage when transported as printable string)
-// - Non configured, you don't need set a unique machine and/or data center id
-// - K-ordered
-// - Embedded time with 1 second precision
-// - Unicity guaranteed for 16,777,216 (24 bits) unique ids per second and per host/process
-//
-// Best used with xlog's RequestIDHandler (https://godoc.org/github.com/rs/xlog#RequestIDHandler).
-//
-// References:
-//
-// - http://www.slideshare.net/davegardnerisme/unique-id-generation-in-distributed-systems
-// - https://en.wikipedia.org/wiki/Universally_unique_identifier
-// - https://blog.twitter.com/2010/announcing-snowflake
-package xid
-
-import (
- "bytes"
- "crypto/sha256"
- "crypto/rand"
- "database/sql/driver"
- "encoding/binary"
- "fmt"
- "hash/crc32"
- "io/ioutil"
- "os"
- "sort"
- "sync/atomic"
- "time"
-)
-
-// Code inspired from mgo/bson ObjectId
-
-// ID represents a unique request id
-type ID [rawLen]byte
-
-const (
- encodedLen = 20 // string encoded len
- rawLen = 12 // binary raw len
-
- // encoding stores a custom version of the base32 encoding with lower case
- // letters.
- encoding = "0123456789abcdefghijklmnopqrstuv"
-)
-
-var (
- // objectIDCounter is atomically incremented when generating a new ObjectId. It's
- // used as the counter part of an id. This id is initialized with a random value.
- objectIDCounter = randInt()
-
- // machineID is generated once and used in subsequent calls to the New* functions.
- machineID = readMachineID()
-
- // pid stores the current process id
- pid = os.Getpid()
-
- nilID ID
-
- // dec is the decoding map for base32 encoding
- dec [256]byte
-)
-
-func init() {
- for i := 0; i < len(dec); i++ {
- dec[i] = 0xFF
- }
- for i := 0; i < len(encoding); i++ {
- dec[encoding[i]] = byte(i)
- }
-
- // If /proc/self/cpuset exists and is not /, we can assume that we are in a
- // form of container and use the content of cpuset xor-ed with the PID in
- // order get a reasonable machine global unique PID.
- b, err := ioutil.ReadFile("/proc/self/cpuset")
- if err == nil && len(b) > 1 {
- pid ^= int(crc32.ChecksumIEEE(b))
- }
-}
-
-// readMachineID generates a machine ID, derived from a platform-specific machine ID
-// value, or else the machine's hostname, or else a randomly-generated number.
-// It panics if all of these methods fail.
-func readMachineID() []byte {
- id := make([]byte, 3)
- hid, err := readPlatformMachineID()
- if err != nil || len(hid) == 0 {
- hid, err = os.Hostname()
- }
- if err == nil && len(hid) != 0 {
- hw := sha256.New()
- hw.Write([]byte(hid))
- copy(id, hw.Sum(nil))
- } else {
- // Fallback to rand number if machine id can't be gathered
- if _, randErr := rand.Reader.Read(id); randErr != nil {
- panic(fmt.Errorf("xid: cannot get hostname nor generate a random number: %v; %v", err, randErr))
- }
- }
- return id
-}
-
-// randInt generates a random uint32
-func randInt() uint32 {
- b := make([]byte, 3)
- if _, err := rand.Reader.Read(b); err != nil {
- panic(fmt.Errorf("xid: cannot generate random number: %v;", err))
- }
- return uint32(b[0])<<16 | uint32(b[1])<<8 | uint32(b[2])
-}
-
-// New generates a globally unique ID
-func New() ID {
- return NewWithTime(time.Now())
-}
-
-// NewWithTime generates a globally unique ID with the passed in time
-func NewWithTime(t time.Time) ID {
- var id ID
- // Timestamp, 4 bytes, big endian
- binary.BigEndian.PutUint32(id[:], uint32(t.Unix()))
- // Machine ID, 3 bytes
- id[4] = machineID[0]
- id[5] = machineID[1]
- id[6] = machineID[2]
- // Pid, 2 bytes, specs don't specify endianness, but we use big endian.
- id[7] = byte(pid >> 8)
- id[8] = byte(pid)
- // Increment, 3 bytes, big endian
- i := atomic.AddUint32(&objectIDCounter, 1)
- id[9] = byte(i >> 16)
- id[10] = byte(i >> 8)
- id[11] = byte(i)
- return id
-}
-
-// FromString reads an ID from its string representation
-func FromString(id string) (ID, error) {
- i := &ID{}
- err := i.UnmarshalText([]byte(id))
- return *i, err
-}
-
-// String returns a base32 hex lowercased with no padding representation of the id (char set is 0-9, a-v).
-func (id ID) String() string {
- text := make([]byte, encodedLen)
- encode(text, id[:])
- return string(text)
-}
-
-// Encode encodes the id using base32 encoding, writing 20 bytes to dst and return it.
-func (id ID) Encode(dst []byte) []byte {
- encode(dst, id[:])
- return dst
-}
-
-// MarshalText implements encoding/text TextMarshaler interface
-func (id ID) MarshalText() ([]byte, error) {
- text := make([]byte, encodedLen)
- encode(text, id[:])
- return text, nil
-}
-
-// MarshalJSON implements encoding/json Marshaler interface
-func (id ID) MarshalJSON() ([]byte, error) {
- if id.IsNil() {
- return []byte("null"), nil
- }
- text := make([]byte, encodedLen+2)
- encode(text[1:encodedLen+1], id[:])
- text[0], text[encodedLen+1] = '"', '"'
- return text, nil
-}
-
-// encode by unrolling the stdlib base32 algorithm + removing all safe checks
-func encode(dst, id []byte) {
- _ = dst[19]
- _ = id[11]
-
- dst[19] = encoding[(id[11]<<4)&0x1F]
- dst[18] = encoding[(id[11]>>1)&0x1F]
- dst[17] = encoding[(id[11]>>6)|(id[10]<<2)&0x1F]
- dst[16] = encoding[id[10]>>3]
- dst[15] = encoding[id[9]&0x1F]
- dst[14] = encoding[(id[9]>>5)|(id[8]<<3)&0x1F]
- dst[13] = encoding[(id[8]>>2)&0x1F]
- dst[12] = encoding[id[8]>>7|(id[7]<<1)&0x1F]
- dst[11] = encoding[(id[7]>>4)|(id[6]<<4)&0x1F]
- dst[10] = encoding[(id[6]>>1)&0x1F]
- dst[9] = encoding[(id[6]>>6)|(id[5]<<2)&0x1F]
- dst[8] = encoding[id[5]>>3]
- dst[7] = encoding[id[4]&0x1F]
- dst[6] = encoding[id[4]>>5|(id[3]<<3)&0x1F]
- dst[5] = encoding[(id[3]>>2)&0x1F]
- dst[4] = encoding[id[3]>>7|(id[2]<<1)&0x1F]
- dst[3] = encoding[(id[2]>>4)|(id[1]<<4)&0x1F]
- dst[2] = encoding[(id[1]>>1)&0x1F]
- dst[1] = encoding[(id[1]>>6)|(id[0]<<2)&0x1F]
- dst[0] = encoding[id[0]>>3]
-}
-
-// UnmarshalText implements encoding/text TextUnmarshaler interface
-func (id *ID) UnmarshalText(text []byte) error {
- if len(text) != encodedLen {
- return ErrInvalidID
- }
- for _, c := range text {
- if dec[c] == 0xFF {
- return ErrInvalidID
- }
- }
- if !decode(id, text) {
- *id = nilID
- return ErrInvalidID
- }
- return nil
-}
-
-// UnmarshalJSON implements encoding/json Unmarshaler interface
-func (id *ID) UnmarshalJSON(b []byte) error {
- s := string(b)
- if s == "null" {
- *id = nilID
- return nil
- }
- // Check the slice length to prevent panic on passing it to UnmarshalText()
- if len(b) < 2 {
- return ErrInvalidID
- }
- return id.UnmarshalText(b[1 : len(b)-1])
-}
-
-// decode by unrolling the stdlib base32 algorithm + customized safe check.
-func decode(id *ID, src []byte) bool {
- _ = src[19]
- _ = id[11]
-
- id[11] = dec[src[17]]<<6 | dec[src[18]]<<1 | dec[src[19]]>>4
- // check the last byte
- if encoding[(id[11]<<4)&0x1F] != src[19] {
- return false
- }
- id[10] = dec[src[16]]<<3 | dec[src[17]]>>2
- id[9] = dec[src[14]]<<5 | dec[src[15]]
- id[8] = dec[src[12]]<<7 | dec[src[13]]<<2 | dec[src[14]]>>3
- id[7] = dec[src[11]]<<4 | dec[src[12]]>>1
- id[6] = dec[src[9]]<<6 | dec[src[10]]<<1 | dec[src[11]]>>4
- id[5] = dec[src[8]]<<3 | dec[src[9]]>>2
- id[4] = dec[src[6]]<<5 | dec[src[7]]
- id[3] = dec[src[4]]<<7 | dec[src[5]]<<2 | dec[src[6]]>>3
- id[2] = dec[src[3]]<<4 | dec[src[4]]>>1
- id[1] = dec[src[1]]<<6 | dec[src[2]]<<1 | dec[src[3]]>>4
- id[0] = dec[src[0]]<<3 | dec[src[1]]>>2
- return true
-}
-
-// Time returns the timestamp part of the id.
-// It's a runtime error to call this method with an invalid id.
-func (id ID) Time() time.Time {
- // First 4 bytes of ObjectId is 32-bit big-endian seconds from epoch.
- secs := int64(binary.BigEndian.Uint32(id[0:4]))
- return time.Unix(secs, 0)
-}
-
-// Machine returns the 3-byte machine id part of the id.
-// It's a runtime error to call this method with an invalid id.
-func (id ID) Machine() []byte {
- return id[4:7]
-}
-
-// Pid returns the process id part of the id.
-// It's a runtime error to call this method with an invalid id.
-func (id ID) Pid() uint16 {
- return binary.BigEndian.Uint16(id[7:9])
-}
-
-// Counter returns the incrementing value part of the id.
-// It's a runtime error to call this method with an invalid id.
-func (id ID) Counter() int32 {
- b := id[9:12]
- // Counter is stored as big-endian 3-byte value
- return int32(uint32(b[0])<<16 | uint32(b[1])<<8 | uint32(b[2]))
-}
-
-// Value implements the driver.Valuer interface.
-func (id ID) Value() (driver.Value, error) {
- if id.IsNil() {
- return nil, nil
- }
- b, err := id.MarshalText()
- return string(b), err
-}
-
-// Scan implements the sql.Scanner interface.
-func (id *ID) Scan(value interface{}) (err error) {
- switch val := value.(type) {
- case string:
- return id.UnmarshalText([]byte(val))
- case []byte:
- return id.UnmarshalText(val)
- case nil:
- *id = nilID
- return nil
- default:
- return fmt.Errorf("xid: scanning unsupported type: %T", value)
- }
-}
-
-// IsNil Returns true if this is a "nil" ID
-func (id ID) IsNil() bool {
- return id == nilID
-}
-
-// Alias of IsNil
-func (id ID) IsZero() bool {
- return id.IsNil()
-}
-
-// NilID returns a zero value for `xid.ID`.
-func NilID() ID {
- return nilID
-}
-
-// Bytes returns the byte array representation of `ID`
-func (id ID) Bytes() []byte {
- return id[:]
-}
-
-// FromBytes convert the byte array representation of `ID` back to `ID`
-func FromBytes(b []byte) (ID, error) {
- var id ID
- if len(b) != rawLen {
- return id, ErrInvalidID
- }
- copy(id[:], b)
- return id, nil
-}
-
-// Compare returns an integer comparing two IDs. It behaves just like `bytes.Compare`.
-// The result will be 0 if two IDs are identical, -1 if current id is less than the other one,
-// and 1 if current id is greater than the other.
-func (id ID) Compare(other ID) int {
- return bytes.Compare(id[:], other[:])
-}
-
-type sorter []ID
-
-func (s sorter) Len() int {
- return len(s)
-}
-
-func (s sorter) Less(i, j int) bool {
- return s[i].Compare(s[j]) < 0
-}
-
-func (s sorter) Swap(i, j int) {
- s[i], s[j] = s[j], s[i]
-}
-
-// Sort sorts an array of IDs inplace.
-// It works by wrapping `[]ID` and use `sort.Sort`.
-func Sort(ids []ID) {
- sort.Sort(sorter(ids))
-}