Vendor things
This commit is contained in:
parent
5deceec006
commit
977e3c17e5
19434 changed files with 10682014 additions and 0 deletions
1
third-party/vendor/uuid/.cargo-checksum.json
vendored
Normal file
1
third-party/vendor/uuid/.cargo-checksum.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"files":{"Cargo.toml":"97148562e0953fb78f1a174448530dc5fefedf983ca46c21c4bffb06fd997351","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"436bc5a105d8e57dcd8778730f3754f7bf39c14d2f530e4cde4bd2d17a83ec3d","README.md":"5ce601f007d7c2c3b13068a7e9938e08aca71944cb0b4179c627196b06a70a7a","src/builder.rs":"2d6e3bf66fc87e36c44b1a8c108dca70f01f6296ac0d50d0a788b69b5a3dff88","src/error.rs":"621799694111aab9d6e570290f4d1b341fe6be58d2b3425fa7891ada7575cab7","src/external.rs":"a0640bdb98de1c24fcc9851a438a5abe6f7e3acb195885c817a64fac25521b9d","src/external/arbitrary_support.rs":"7e7fbcc4b8af5878b71858a1f5fa31e85d84fc2fd159614f8d450ba1fe06ac28","src/external/borsh_support.rs":"b49d82a59653445ba26db46a1515294b1ab480c0671dbe5499dfd1fb02588b3b","src/external/serde_support.rs":"1263176b9916bf61fe3ab32140c22e2e757ea29ffff6f5459b1b720acbe2ed9d","src/external/slog_support.rs":"53c6251e424bdc9b6ba35defb4c723d4d34d44053badbf98e1c7c3e7c83fbb5e","src/fmt.rs":"3bf88d68d838bef81380a1e669a86eee46f24a8113effbd7b4e92da714ec97c7","src/lib.rs":"96d77474e7d9312cc287c5fad2fa44caf775ef0ce7da825e90c736cbcee615d4","src/macros.rs":"8fa9380a39e9952f6adc9eb858264fc09219a97215f4e54768d9e0ec7f520db7","src/md5.rs":"316d65b760ffa58beb6aa678be24359eb21a744e9e143bc99c11fe1907659245","src/parser.rs":"3f30a776ed1792107fed88c15fb393167283cc487efc647fb6504824a4fc3afb","src/rng.rs":"b9f69610560aa5b5d9b2eaa16fb2239515bd163da126cf5c392e5fb9b0296c3e","src/sha1.rs":"e1a9657e11f1ed1ede33c0655f9c2641059b7c24f17be4ac425c930cc216e019","src/timestamp.rs":"2b50321ee768cd9c3ad5bdf1e4924e8e5deaa8d1a031d24dcfaf2fec44530429","src/v1.rs":"123c4b23d0458e77e6c3ed6235e0c786436e53f53d1c8074cf80d77c2ae40611","src/v3.rs":"b7d605c4d2f56a9e57bfe779ef2488fa612c7cb28568f68252093f48ac2edef4","src/v4.rs":"4f06567460871348df0ff2825e9faad9d950a9337e409cb2b568c86118addb97","src/v5.rs":"64e3feb673c8411954f930188e756803b90b57d13ec36652cd2c669e81654333","src/v6.rs":"2dd938c5bf6d1960f4fb7d179a6163c1cfd76ab24f98aaca85d0f74940184645","src/v7.rs":"e46924c0c9c9b1ac6746180d78cd3531920fbd8379f1629abdcec7914bae36c8","src/v8.rs":"8705405fef52e4706c7cf99f7ed231dde733b7cd08ced79be9e29c949be2280f"},"package":"f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a"}
|
||||
208
third-party/vendor/uuid/Cargo.toml
vendored
Normal file
208
third-party/vendor/uuid/Cargo.toml
vendored
Normal file
|
|
@ -0,0 +1,208 @@
|
|||
# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
|
||||
#
|
||||
# When uploading crates to the registry Cargo will automatically
|
||||
# "normalize" Cargo.toml files for maximal compatibility
|
||||
# with all versions of Cargo and also rewrite `path` dependencies
|
||||
# to registry (e.g., crates.io) dependencies.
|
||||
#
|
||||
# If you are reading this file be aware that the original Cargo.toml
|
||||
# will likely look very different (and much more reasonable).
|
||||
# See Cargo.toml.orig for the original contents.
|
||||
|
||||
[package]
|
||||
edition = "2018"
|
||||
rust-version = "1.60.0"
|
||||
name = "uuid"
|
||||
version = "1.7.0"
|
||||
authors = [
|
||||
"Ashley Mannix<ashleymannix@live.com.au>",
|
||||
"Christopher Armstrong",
|
||||
"Dylan DPC<dylan.dpc@gmail.com>",
|
||||
"Hunar Roop Kahlon<hunar.roop@gmail.com>",
|
||||
]
|
||||
include = [
|
||||
"src",
|
||||
"README.md",
|
||||
"LICENSE-APACHE",
|
||||
"LICENSE-MIT",
|
||||
]
|
||||
description = "A library to generate and parse UUIDs."
|
||||
homepage = "https://github.com/uuid-rs/uuid"
|
||||
documentation = "https://docs.rs/uuid"
|
||||
readme = "README.md"
|
||||
keywords = [
|
||||
"guid",
|
||||
"unique",
|
||||
"uuid",
|
||||
]
|
||||
categories = [
|
||||
"data-structures",
|
||||
"no-std",
|
||||
"parser-implementations",
|
||||
"wasm",
|
||||
]
|
||||
license = "Apache-2.0 OR MIT"
|
||||
repository = "https://github.com/uuid-rs/uuid"
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
features = [
|
||||
"serde",
|
||||
"arbitrary",
|
||||
"slog",
|
||||
"borsh",
|
||||
"v1",
|
||||
"v3",
|
||||
"v4",
|
||||
"v5",
|
||||
"v6",
|
||||
"v7",
|
||||
"v8",
|
||||
]
|
||||
rustc-args = [
|
||||
"--cfg",
|
||||
"uuid_unstable",
|
||||
]
|
||||
rustdoc-args = [
|
||||
"--cfg",
|
||||
"uuid_unstable",
|
||||
]
|
||||
targets = ["x86_64-unknown-linux-gnu"]
|
||||
|
||||
[package.metadata.playground]
|
||||
features = [
|
||||
"serde",
|
||||
"v1",
|
||||
"v3",
|
||||
"v4",
|
||||
"v5",
|
||||
"v6",
|
||||
"v7",
|
||||
"v8",
|
||||
]
|
||||
|
||||
[dependencies.arbitrary]
|
||||
version = "1.1.3"
|
||||
optional = true
|
||||
|
||||
[dependencies.atomic]
|
||||
version = "0.5"
|
||||
optional = true
|
||||
default-features = false
|
||||
|
||||
[dependencies.borsh]
|
||||
version = "1"
|
||||
optional = true
|
||||
default-features = false
|
||||
|
||||
[dependencies.borsh-derive]
|
||||
version = "1"
|
||||
optional = true
|
||||
default-features = false
|
||||
|
||||
[dependencies.bytemuck]
|
||||
version = "1.14.0"
|
||||
features = ["derive"]
|
||||
optional = true
|
||||
|
||||
[dependencies.getrandom]
|
||||
version = "0.2"
|
||||
optional = true
|
||||
|
||||
[dependencies.md-5]
|
||||
version = "0.10"
|
||||
optional = true
|
||||
default-features = false
|
||||
|
||||
[dependencies.rand]
|
||||
version = "0.8"
|
||||
optional = true
|
||||
|
||||
[dependencies.serde]
|
||||
version = "1.0.56"
|
||||
optional = true
|
||||
default-features = false
|
||||
|
||||
[dependencies.sha1_smol]
|
||||
version = "1"
|
||||
optional = true
|
||||
default-features = false
|
||||
|
||||
[dependencies.slog]
|
||||
version = "2"
|
||||
optional = true
|
||||
|
||||
[dependencies.uuid-macro-internal]
|
||||
version = "1.7.0"
|
||||
optional = true
|
||||
|
||||
[dependencies.wasm-bindgen]
|
||||
version = "0.2"
|
||||
optional = true
|
||||
|
||||
[dependencies.zerocopy]
|
||||
version = "0.6"
|
||||
optional = true
|
||||
|
||||
[dev-dependencies.bincode]
|
||||
version = "1.0"
|
||||
|
||||
[dev-dependencies.rustversion]
|
||||
version = "1"
|
||||
|
||||
[dev-dependencies.serde_derive]
|
||||
version = "1.0.79"
|
||||
|
||||
[dev-dependencies.serde_json]
|
||||
version = "1.0"
|
||||
|
||||
[dev-dependencies.serde_test]
|
||||
version = "1.0.56"
|
||||
|
||||
[dev-dependencies.trybuild]
|
||||
version = "1.0.52"
|
||||
|
||||
[features]
|
||||
atomic = ["dep:atomic"]
|
||||
borsh = [
|
||||
"dep:borsh",
|
||||
"dep:borsh-derive",
|
||||
]
|
||||
default = ["std"]
|
||||
fast-rng = [
|
||||
"rng",
|
||||
"dep:rand",
|
||||
]
|
||||
js = [
|
||||
"dep:wasm-bindgen",
|
||||
"getrandom?/js",
|
||||
]
|
||||
macro-diagnostics = ["dep:uuid-macro-internal"]
|
||||
md5 = ["dep:md-5"]
|
||||
rng = ["dep:getrandom"]
|
||||
sha1 = ["dep:sha1_smol"]
|
||||
std = []
|
||||
v1 = ["atomic"]
|
||||
v3 = ["md5"]
|
||||
v4 = ["rng"]
|
||||
v5 = ["sha1"]
|
||||
v6 = ["atomic"]
|
||||
v7 = [
|
||||
"atomic",
|
||||
"rng",
|
||||
]
|
||||
v8 = []
|
||||
|
||||
[target."cfg(all(target_arch = \"wasm32\", target_vendor = \"unknown\", target_os = \"unknown\"))".dev-dependencies.wasm-bindgen-test]
|
||||
version = "0.3"
|
||||
|
||||
[target."cfg(target = \"wasm32-unknown-unknown\")".dev-dependencies.wasm-bindgen]
|
||||
version = "0.2"
|
||||
|
||||
[badges.is-it-maintained-issue-resolution]
|
||||
repository = "uuid-rs/uuid"
|
||||
|
||||
[badges.is-it-maintained-open-issues]
|
||||
repository = "uuid-rs/uuid"
|
||||
|
||||
[badges.maintenance]
|
||||
status = "actively-developed"
|
||||
201
third-party/vendor/uuid/LICENSE-APACHE
vendored
Normal file
201
third-party/vendor/uuid/LICENSE-APACHE
vendored
Normal file
|
|
@ -0,0 +1,201 @@
|
|||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
26
third-party/vendor/uuid/LICENSE-MIT
vendored
Normal file
26
third-party/vendor/uuid/LICENSE-MIT
vendored
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
Copyright (c) 2014 The Rust Project Developers
|
||||
Copyright (c) 2018 Ashley Mannix, Christopher Armstrong, Dylan DPC, Hunar Roop Kahlon
|
||||
|
||||
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.
|
||||
93
third-party/vendor/uuid/README.md
vendored
Normal file
93
third-party/vendor/uuid/README.md
vendored
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
# `uuid`
|
||||
|
||||
[](https://crates.io/crates/uuid)
|
||||
[](https://github.com/uuid-rs/uuid/actions/workflows/ci.yml)
|
||||
|
||||
Here's an example of a UUID:
|
||||
|
||||
```text
|
||||
67e55044-10b1-426f-9247-bb680e5fe0c8
|
||||
```
|
||||
|
||||
A UUID is a unique 128-bit value, stored as 16 octets, and regularly
|
||||
formatted as a hex string in five groups. UUIDs are used to assign unique
|
||||
identifiers to entities without requiring a central allocating authority.
|
||||
|
||||
They are particularly useful in distributed systems, though can be used in
|
||||
disparate areas, such as databases and network protocols. Typically a UUID
|
||||
is displayed in a readable string form as a sequence of hexadecimal digits,
|
||||
separated into groups by hyphens.
|
||||
|
||||
The uniqueness property is not strictly guaranteed, however for all
|
||||
practical purposes, it can be assumed that an unintentional collision would
|
||||
be extremely unlikely.
|
||||
|
||||
## Getting started
|
||||
|
||||
Add the following to your `Cargo.toml`:
|
||||
|
||||
```toml
|
||||
[dependencies.uuid]
|
||||
version = "1.7.0"
|
||||
features = [
|
||||
"v4", # Lets you generate random UUIDs
|
||||
"fast-rng", # Use a faster (but still sufficiently random) RNG
|
||||
"macro-diagnostics", # Enable better diagnostics for compile-time UUIDs
|
||||
]
|
||||
```
|
||||
|
||||
When you want a UUID, you can generate one:
|
||||
|
||||
```rust
|
||||
use uuid::Uuid;
|
||||
|
||||
let id = Uuid::new_v4();
|
||||
```
|
||||
|
||||
If you have a UUID value, you can use its string literal form inline:
|
||||
|
||||
```rust
|
||||
use uuid::{uuid, Uuid};
|
||||
|
||||
const ID: Uuid = uuid!("67e55044-10b1-426f-9247-bb680e5fe0c8");
|
||||
```
|
||||
|
||||
You can also parse UUIDs without needing any crate features:
|
||||
|
||||
```rust
|
||||
use uuid::{Uuid, Version};
|
||||
|
||||
let my_uuid = Uuid::parse_str("67e55044-10b1-426f-9247-bb680e5fe0c8")?;
|
||||
|
||||
assert_eq!(Some(Version::Random), my_uuid.get_version());
|
||||
```
|
||||
|
||||
If you'd like to parse UUIDs _really_ fast, check out the [`uuid-simd`](https://github.com/nugine/uuid-simd)
|
||||
library.
|
||||
|
||||
For more details on using `uuid`, [see the library documentation](https://docs.rs/uuid/1.7.0/uuid).
|
||||
|
||||
## References
|
||||
|
||||
* [`uuid` library docs](https://docs.rs/uuid/1.7.0/uuid).
|
||||
* [Wikipedia: Universally Unique Identifier](http://en.wikipedia.org/wiki/Universally_unique_identifier).
|
||||
* [RFC4122: A Universally Unique IDentifier (UUID) URN Namespace](http://tools.ietf.org/html/rfc4122).
|
||||
|
||||
---
|
||||
# License
|
||||
|
||||
Licensed under either of
|
||||
|
||||
* Apache License, Version 2.0, (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
|
||||
* MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT)
|
||||
|
||||
at your option.
|
||||
|
||||
|
||||
[](https://app.fossa.com/projects/git%2Bgithub.com%2Fuuid-rs%2Fuuid?ref=badge_large)
|
||||
|
||||
## Contribution
|
||||
|
||||
Unless you explicitly state otherwise, any contribution intentionally submitted
|
||||
for inclusion in the work by you, as defined in the Apache-2.0 license, shall
|
||||
be dual licensed as above, without any additional terms or conditions.
|
||||
903
third-party/vendor/uuid/src/builder.rs
vendored
Normal file
903
third-party/vendor/uuid/src/builder.rs
vendored
Normal file
|
|
@ -0,0 +1,903 @@
|
|||
// Copyright 2013-2014 The Rust Project Developers.
|
||||
// Copyright 2018 The Uuid Project Developers.
|
||||
//
|
||||
// See the COPYRIGHT file at the top-level directory of this distribution.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
//! A Builder type for [`Uuid`]s.
|
||||
//!
|
||||
//! [`Uuid`]: ../struct.Uuid.html
|
||||
|
||||
use crate::{error::*, timestamp, Bytes, Uuid, Variant, Version};
|
||||
|
||||
/// A builder for creating a UUID.
|
||||
///
|
||||
/// This type is useful if you need to mutate individual fields of a [`Uuid`]
|
||||
/// while constructing it. Since the [`Uuid`] type is `Copy`, it doesn't offer
|
||||
/// any methods to mutate in place. They live on the `Builder` instead.
|
||||
///
|
||||
/// The `Builder` type also always exposes APIs to construct [`Uuid`]s for any
|
||||
/// version without needing crate features or additional dependencies. It's a
|
||||
/// lower-level API than the methods on [`Uuid`].
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Creating a version 4 UUID from externally generated random bytes:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::{Builder, Version, Variant};
|
||||
/// # let rng = || [
|
||||
/// # 70, 235, 208, 238, 14, 109, 67, 201, 185, 13, 204, 195, 90,
|
||||
/// # 145, 63, 62,
|
||||
/// # ];
|
||||
/// let random_bytes = rng();
|
||||
///
|
||||
/// let uuid = Builder::from_random_bytes(random_bytes).into_uuid();
|
||||
///
|
||||
/// assert_eq!(Some(Version::Random), uuid.get_version());
|
||||
/// assert_eq!(Variant::RFC4122, uuid.get_variant());
|
||||
/// ```
|
||||
#[allow(missing_copy_implementations)]
|
||||
#[derive(Debug)]
|
||||
pub struct Builder(Uuid);
|
||||
|
||||
impl Uuid {
|
||||
/// The 'nil UUID' (all zeros).
|
||||
///
|
||||
/// The nil UUID is a special form of UUID that is specified to have all
|
||||
/// 128 bits set to zero.
|
||||
///
|
||||
/// # References
|
||||
///
|
||||
/// * [Nil UUID in RFC4122](https://tools.ietf.org/html/rfc4122.html#section-4.1.7)
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Uuid;
|
||||
/// let uuid = Uuid::nil();
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "00000000-0000-0000-0000-000000000000",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// ```
|
||||
pub const fn nil() -> Self {
|
||||
Uuid::from_bytes([0; 16])
|
||||
}
|
||||
|
||||
/// The 'max UUID' (all ones).
|
||||
///
|
||||
/// The max UUID is a special form of UUID that is specified to have all
|
||||
/// 128 bits set to one.
|
||||
///
|
||||
/// # References
|
||||
///
|
||||
/// * [Max UUID in Draft RFC: New UUID Formats, Version 4](https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-04#section-5.4)
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Uuid;
|
||||
/// let uuid = Uuid::max();
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "ffffffff-ffff-ffff-ffff-ffffffffffff",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// ```
|
||||
pub const fn max() -> Self {
|
||||
Uuid::from_bytes([0xFF; 16])
|
||||
}
|
||||
|
||||
/// Creates a UUID from four field values.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Uuid;
|
||||
/// let d1 = 0xa1a2a3a4;
|
||||
/// let d2 = 0xb1b2;
|
||||
/// let d3 = 0xc1c2;
|
||||
/// let d4 = [0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8];
|
||||
///
|
||||
/// let uuid = Uuid::from_fields(d1, d2, d3, &d4);
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// ```
|
||||
pub const fn from_fields(d1: u32, d2: u16, d3: u16, d4: &[u8; 8]) -> Uuid {
|
||||
Uuid::from_bytes([
|
||||
(d1 >> 24) as u8,
|
||||
(d1 >> 16) as u8,
|
||||
(d1 >> 8) as u8,
|
||||
d1 as u8,
|
||||
(d2 >> 8) as u8,
|
||||
d2 as u8,
|
||||
(d3 >> 8) as u8,
|
||||
d3 as u8,
|
||||
d4[0],
|
||||
d4[1],
|
||||
d4[2],
|
||||
d4[3],
|
||||
d4[4],
|
||||
d4[5],
|
||||
d4[6],
|
||||
d4[7],
|
||||
])
|
||||
}
|
||||
|
||||
/// Creates a UUID from four field values in little-endian order.
|
||||
///
|
||||
/// The bytes in the `d1`, `d2` and `d3` fields will be flipped to convert
|
||||
/// into big-endian order. This is based on the endianness of the UUID,
|
||||
/// rather than the target environment so bytes will be flipped on both
|
||||
/// big and little endian machines.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Uuid;
|
||||
/// let d1 = 0xa1a2a3a4;
|
||||
/// let d2 = 0xb1b2;
|
||||
/// let d3 = 0xc1c2;
|
||||
/// let d4 = [0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8];
|
||||
///
|
||||
/// let uuid = Uuid::from_fields_le(d1, d2, d3, &d4);
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "a4a3a2a1-b2b1-c2c1-d1d2-d3d4d5d6d7d8",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// ```
|
||||
pub const fn from_fields_le(d1: u32, d2: u16, d3: u16, d4: &[u8; 8]) -> Uuid {
|
||||
Uuid::from_bytes([
|
||||
d1 as u8,
|
||||
(d1 >> 8) as u8,
|
||||
(d1 >> 16) as u8,
|
||||
(d1 >> 24) as u8,
|
||||
(d2) as u8,
|
||||
(d2 >> 8) as u8,
|
||||
d3 as u8,
|
||||
(d3 >> 8) as u8,
|
||||
d4[0],
|
||||
d4[1],
|
||||
d4[2],
|
||||
d4[3],
|
||||
d4[4],
|
||||
d4[5],
|
||||
d4[6],
|
||||
d4[7],
|
||||
])
|
||||
}
|
||||
|
||||
/// Creates a UUID from a 128bit value.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Uuid;
|
||||
/// let v = 0xa1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8u128;
|
||||
///
|
||||
/// let uuid = Uuid::from_u128(v);
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// ```
|
||||
pub const fn from_u128(v: u128) -> Self {
|
||||
Uuid::from_bytes([
|
||||
(v >> 120) as u8,
|
||||
(v >> 112) as u8,
|
||||
(v >> 104) as u8,
|
||||
(v >> 96) as u8,
|
||||
(v >> 88) as u8,
|
||||
(v >> 80) as u8,
|
||||
(v >> 72) as u8,
|
||||
(v >> 64) as u8,
|
||||
(v >> 56) as u8,
|
||||
(v >> 48) as u8,
|
||||
(v >> 40) as u8,
|
||||
(v >> 32) as u8,
|
||||
(v >> 24) as u8,
|
||||
(v >> 16) as u8,
|
||||
(v >> 8) as u8,
|
||||
v as u8,
|
||||
])
|
||||
}
|
||||
|
||||
/// Creates a UUID from a 128bit value in little-endian order.
|
||||
///
|
||||
/// The entire value will be flipped to convert into big-endian order.
|
||||
/// This is based on the endianness of the UUID, rather than the target
|
||||
/// environment so bytes will be flipped on both big and little endian
|
||||
/// machines.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Uuid;
|
||||
/// let v = 0xa1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8u128;
|
||||
///
|
||||
/// let uuid = Uuid::from_u128_le(v);
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "d8d7d6d5-d4d3-d2d1-c2c1-b2b1a4a3a2a1",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// ```
|
||||
pub const fn from_u128_le(v: u128) -> Self {
|
||||
Uuid::from_bytes([
|
||||
v as u8,
|
||||
(v >> 8) as u8,
|
||||
(v >> 16) as u8,
|
||||
(v >> 24) as u8,
|
||||
(v >> 32) as u8,
|
||||
(v >> 40) as u8,
|
||||
(v >> 48) as u8,
|
||||
(v >> 56) as u8,
|
||||
(v >> 64) as u8,
|
||||
(v >> 72) as u8,
|
||||
(v >> 80) as u8,
|
||||
(v >> 88) as u8,
|
||||
(v >> 96) as u8,
|
||||
(v >> 104) as u8,
|
||||
(v >> 112) as u8,
|
||||
(v >> 120) as u8,
|
||||
])
|
||||
}
|
||||
|
||||
/// Creates a UUID from two 64bit values.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Uuid;
|
||||
/// let hi = 0xa1a2a3a4b1b2c1c2u64;
|
||||
/// let lo = 0xd1d2d3d4d5d6d7d8u64;
|
||||
///
|
||||
/// let uuid = Uuid::from_u64_pair(hi, lo);
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// ```
|
||||
pub const fn from_u64_pair(high_bits: u64, low_bits: u64) -> Self {
|
||||
Uuid::from_bytes([
|
||||
(high_bits >> 56) as u8,
|
||||
(high_bits >> 48) as u8,
|
||||
(high_bits >> 40) as u8,
|
||||
(high_bits >> 32) as u8,
|
||||
(high_bits >> 24) as u8,
|
||||
(high_bits >> 16) as u8,
|
||||
(high_bits >> 8) as u8,
|
||||
high_bits as u8,
|
||||
(low_bits >> 56) as u8,
|
||||
(low_bits >> 48) as u8,
|
||||
(low_bits >> 40) as u8,
|
||||
(low_bits >> 32) as u8,
|
||||
(low_bits >> 24) as u8,
|
||||
(low_bits >> 16) as u8,
|
||||
(low_bits >> 8) as u8,
|
||||
low_bits as u8,
|
||||
])
|
||||
}
|
||||
|
||||
/// Creates a UUID using the supplied bytes.
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
/// This function will return an error if `b` has any length other than 16.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # fn main() -> Result<(), uuid::Error> {
|
||||
/// # use uuid::Uuid;
|
||||
/// let bytes = [
|
||||
/// 0xa1, 0xa2, 0xa3, 0xa4,
|
||||
/// 0xb1, 0xb2,
|
||||
/// 0xc1, 0xc2,
|
||||
/// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
|
||||
/// ];
|
||||
///
|
||||
/// let uuid = Uuid::from_slice(&bytes)?;
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
pub fn from_slice(b: &[u8]) -> Result<Uuid, Error> {
|
||||
if b.len() != 16 {
|
||||
return Err(Error(ErrorKind::ByteLength { len: b.len() }));
|
||||
}
|
||||
|
||||
let mut bytes: Bytes = [0; 16];
|
||||
bytes.copy_from_slice(b);
|
||||
Ok(Uuid::from_bytes(bytes))
|
||||
}
|
||||
|
||||
/// Creates a UUID using the supplied bytes in little endian order.
|
||||
///
|
||||
/// The individual fields encoded in the buffer will be flipped.
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
/// This function will return an error if `b` has any length other than 16.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # fn main() -> Result<(), uuid::Error> {
|
||||
/// # use uuid::Uuid;
|
||||
/// let bytes = [
|
||||
/// 0xa1, 0xa2, 0xa3, 0xa4,
|
||||
/// 0xb1, 0xb2,
|
||||
/// 0xc1, 0xc2,
|
||||
/// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
|
||||
/// ];
|
||||
///
|
||||
/// let uuid = Uuid::from_slice_le(&bytes)?;
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// "a4a3a2a1-b2b1-c2c1-d1d2-d3d4d5d6d7d8"
|
||||
/// );
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
pub fn from_slice_le(b: &[u8]) -> Result<Uuid, Error> {
|
||||
if b.len() != 16 {
|
||||
return Err(Error(ErrorKind::ByteLength { len: b.len() }));
|
||||
}
|
||||
|
||||
let mut bytes: Bytes = [0; 16];
|
||||
bytes.copy_from_slice(b);
|
||||
Ok(Uuid::from_bytes_le(bytes))
|
||||
}
|
||||
|
||||
/// Creates a UUID using the supplied bytes.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # fn main() -> Result<(), uuid::Error> {
|
||||
/// # use uuid::Uuid;
|
||||
/// let bytes = [
|
||||
/// 0xa1, 0xa2, 0xa3, 0xa4,
|
||||
/// 0xb1, 0xb2,
|
||||
/// 0xc1, 0xc2,
|
||||
/// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
|
||||
/// ];
|
||||
///
|
||||
/// let uuid = Uuid::from_bytes(bytes);
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8"
|
||||
/// );
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
#[inline]
|
||||
pub const fn from_bytes(bytes: Bytes) -> Uuid {
|
||||
Uuid(bytes)
|
||||
}
|
||||
|
||||
/// Creates a UUID using the supplied bytes in little endian order.
|
||||
///
|
||||
/// The individual fields encoded in the buffer will be flipped.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # fn main() -> Result<(), uuid::Error> {
|
||||
/// # use uuid::Uuid;
|
||||
/// let bytes = [
|
||||
/// 0xa1, 0xa2, 0xa3, 0xa4,
|
||||
/// 0xb1, 0xb2,
|
||||
/// 0xc1, 0xc2,
|
||||
/// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
|
||||
/// ];
|
||||
///
|
||||
/// let uuid = Uuid::from_bytes_le(bytes);
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "a4a3a2a1-b2b1-c2c1-d1d2-d3d4d5d6d7d8",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
pub const fn from_bytes_le(b: Bytes) -> Uuid {
|
||||
Uuid([
|
||||
b[3], b[2], b[1], b[0], b[5], b[4], b[7], b[6], b[8], b[9], b[10], b[11], b[12], b[13],
|
||||
b[14], b[15],
|
||||
])
|
||||
}
|
||||
|
||||
/// Creates a reference to a UUID from a reference to the supplied bytes.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # fn main() -> Result<(), uuid::Error> {
|
||||
/// # use uuid::Uuid;
|
||||
/// let bytes = [
|
||||
/// 0xa1, 0xa2, 0xa3, 0xa4,
|
||||
/// 0xb1, 0xb2,
|
||||
/// 0xc1, 0xc2,
|
||||
/// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
|
||||
/// ];
|
||||
///
|
||||
/// let uuid = Uuid::from_bytes_ref(&bytes);
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8"
|
||||
/// );
|
||||
///
|
||||
/// assert!(std::ptr::eq(
|
||||
/// uuid as *const Uuid as *const u8,
|
||||
/// &bytes as *const [u8; 16] as *const u8,
|
||||
/// ));
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
#[inline]
|
||||
pub fn from_bytes_ref(bytes: &Bytes) -> &Uuid {
|
||||
// SAFETY: `Bytes` and `Uuid` have the same ABI
|
||||
unsafe { &*(bytes as *const Bytes as *const Uuid) }
|
||||
}
|
||||
|
||||
// NOTE: There is no `from_u128_ref` because in little-endian
|
||||
// environments the value isn't properly encoded. Callers would
|
||||
// need to use `.to_be()` themselves.
|
||||
}
|
||||
|
||||
impl Builder {
|
||||
/// Creates a `Builder` using the supplied bytes.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Builder;
|
||||
/// let bytes = [
|
||||
/// 0xa1, 0xa2, 0xa3, 0xa4,
|
||||
/// 0xb1, 0xb2,
|
||||
/// 0xc1, 0xc2,
|
||||
/// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
|
||||
/// ];
|
||||
///
|
||||
/// let uuid = Builder::from_bytes(bytes).into_uuid();
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// ```
|
||||
pub const fn from_bytes(b: Bytes) -> Self {
|
||||
Builder(Uuid::from_bytes(b))
|
||||
}
|
||||
|
||||
/// Creates a `Builder` using the supplied bytes in little endian order.
|
||||
///
|
||||
/// The individual fields encoded in the buffer will be flipped.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # fn main() -> Result<(), uuid::Error> {
|
||||
/// # use uuid::{Builder, Uuid};
|
||||
/// let bytes = [
|
||||
/// 0xa1, 0xa2, 0xa3, 0xa4,
|
||||
/// 0xb1, 0xb2,
|
||||
/// 0xc1, 0xc2,
|
||||
/// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
|
||||
/// ];
|
||||
///
|
||||
/// let uuid = Builder::from_bytes_le(bytes).into_uuid();
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "a4a3a2a1-b2b1-c2c1-d1d2-d3d4d5d6d7d8",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
pub const fn from_bytes_le(b: Bytes) -> Self {
|
||||
Builder(Uuid::from_bytes_le(b))
|
||||
}
|
||||
|
||||
/// Creates a `Builder` for a version 1 UUID using the supplied timestamp and node ID.
|
||||
pub const fn from_rfc4122_timestamp(ticks: u64, counter: u16, node_id: &[u8; 6]) -> Self {
|
||||
Builder(timestamp::encode_rfc4122_timestamp(ticks, counter, node_id))
|
||||
}
|
||||
|
||||
/// Creates a `Builder` for a version 3 UUID using the supplied MD5 hashed bytes.
|
||||
pub const fn from_md5_bytes(md5_bytes: Bytes) -> Self {
|
||||
Builder(Uuid::from_bytes(md5_bytes))
|
||||
.with_variant(Variant::RFC4122)
|
||||
.with_version(Version::Md5)
|
||||
}
|
||||
|
||||
/// Creates a `Builder` for a version 4 UUID using the supplied random bytes.
|
||||
///
|
||||
/// This method assumes the bytes are already sufficiently random, it will only
|
||||
/// set the appropriate bits for the UUID version and variant.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::{Builder, Variant, Version};
|
||||
/// # let rng = || [
|
||||
/// # 70, 235, 208, 238, 14, 109, 67, 201, 185, 13, 204, 195, 90,
|
||||
/// # 145, 63, 62,
|
||||
/// # ];
|
||||
/// let random_bytes = rng();
|
||||
/// let uuid = Builder::from_random_bytes(random_bytes).into_uuid();
|
||||
///
|
||||
/// assert_eq!(Some(Version::Random), uuid.get_version());
|
||||
/// assert_eq!(Variant::RFC4122, uuid.get_variant());
|
||||
/// ```
|
||||
pub const fn from_random_bytes(random_bytes: Bytes) -> Self {
|
||||
Builder(Uuid::from_bytes(random_bytes))
|
||||
.with_variant(Variant::RFC4122)
|
||||
.with_version(Version::Random)
|
||||
}
|
||||
|
||||
/// Creates a `Builder` for a version 5 UUID using the supplied SHA-1 hashed bytes.
|
||||
///
|
||||
/// This method assumes the bytes are already a SHA-1 hash, it will only set the appropriate
|
||||
/// bits for the UUID version and variant.
|
||||
pub const fn from_sha1_bytes(sha1_bytes: Bytes) -> Self {
|
||||
Builder(Uuid::from_bytes(sha1_bytes))
|
||||
.with_variant(Variant::RFC4122)
|
||||
.with_version(Version::Sha1)
|
||||
}
|
||||
|
||||
/// Creates a `Builder` for a version 6 UUID using the supplied timestamp and node ID.
|
||||
///
|
||||
/// This method will encode the ticks, counter, and node ID in a sortable UUID.
|
||||
pub const fn from_sorted_rfc4122_timestamp(
|
||||
ticks: u64,
|
||||
counter: u16,
|
||||
node_id: &[u8; 6],
|
||||
) -> Self {
|
||||
Builder(timestamp::encode_sorted_rfc4122_timestamp(
|
||||
ticks, counter, node_id,
|
||||
))
|
||||
}
|
||||
|
||||
/// Creates a `Builder` for a version 7 UUID using the supplied Unix timestamp and random bytes.
|
||||
///
|
||||
/// This method assumes the bytes are already sufficiently random.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Creating a UUID using the current system timestamp:
|
||||
///
|
||||
/// ```
|
||||
/// # use std::convert::TryInto;
|
||||
/// use std::time::{Duration, SystemTime};
|
||||
/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
/// # use uuid::{Builder, Uuid, Variant, Version, Timestamp, NoContext};
|
||||
/// # let rng = || [
|
||||
/// # 70, 235, 208, 238, 14, 109, 67, 201, 185, 13
|
||||
/// # ];
|
||||
/// let ts = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH)?;
|
||||
///
|
||||
/// let random_bytes = rng();
|
||||
///
|
||||
/// let uuid = Builder::from_unix_timestamp_millis(ts.as_millis().try_into()?, &random_bytes).into_uuid();
|
||||
///
|
||||
/// assert_eq!(Some(Version::SortRand), uuid.get_version());
|
||||
/// assert_eq!(Variant::RFC4122, uuid.get_variant());
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
pub const fn from_unix_timestamp_millis(millis: u64, random_bytes: &[u8; 10]) -> Self {
|
||||
Builder(timestamp::encode_unix_timestamp_millis(
|
||||
millis,
|
||||
random_bytes,
|
||||
))
|
||||
}
|
||||
|
||||
/// Creates a `Builder` for a version 8 UUID using the supplied user-defined bytes.
|
||||
///
|
||||
/// This method won't interpret the given bytes in any way, except to set the appropriate
|
||||
/// bits for the UUID version and variant.
|
||||
pub const fn from_custom_bytes(custom_bytes: Bytes) -> Self {
|
||||
Builder::from_bytes(custom_bytes)
|
||||
.with_variant(Variant::RFC4122)
|
||||
.with_version(Version::Custom)
|
||||
}
|
||||
|
||||
/// Creates a `Builder` using the supplied bytes.
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
/// This function will return an error if `b` has any length other than 16.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Builder;
|
||||
/// # fn main() -> Result<(), uuid::Error> {
|
||||
/// let bytes = [
|
||||
/// 0xa1, 0xa2, 0xa3, 0xa4,
|
||||
/// 0xb1, 0xb2,
|
||||
/// 0xc1, 0xc2,
|
||||
/// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
|
||||
/// ];
|
||||
///
|
||||
/// let uuid = Builder::from_slice(&bytes)?.into_uuid();
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
pub fn from_slice(b: &[u8]) -> Result<Self, Error> {
|
||||
Ok(Builder(Uuid::from_slice(b)?))
|
||||
}
|
||||
|
||||
/// Creates a `Builder` using the supplied bytes in little endian order.
|
||||
///
|
||||
/// The individual fields encoded in the buffer will be flipped.
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
/// This function will return an error if `b` has any length other than 16.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Builder;
|
||||
/// # fn main() -> Result<(), uuid::Error> {
|
||||
/// let bytes = [
|
||||
/// 0xa1, 0xa2, 0xa3, 0xa4,
|
||||
/// 0xb1, 0xb2,
|
||||
/// 0xc1, 0xc2,
|
||||
/// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
|
||||
/// ];
|
||||
///
|
||||
/// let uuid = Builder::from_slice_le(&bytes)?.into_uuid();
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "a4a3a2a1-b2b1-c2c1-d1d2-d3d4d5d6d7d8",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
pub fn from_slice_le(b: &[u8]) -> Result<Self, Error> {
|
||||
Ok(Builder(Uuid::from_slice_le(b)?))
|
||||
}
|
||||
|
||||
/// Creates a `Builder` from four field values.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Builder;
|
||||
/// let d1 = 0xa1a2a3a4;
|
||||
/// let d2 = 0xb1b2;
|
||||
/// let d3 = 0xc1c2;
|
||||
/// let d4 = [0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8];
|
||||
///
|
||||
/// let uuid = Builder::from_fields(d1, d2, d3, &d4).into_uuid();
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8"
|
||||
/// );
|
||||
/// ```
|
||||
pub const fn from_fields(d1: u32, d2: u16, d3: u16, d4: &[u8; 8]) -> Self {
|
||||
Builder(Uuid::from_fields(d1, d2, d3, d4))
|
||||
}
|
||||
|
||||
/// Creates a `Builder` from four field values.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Builder;
|
||||
/// let d1 = 0xa1a2a3a4;
|
||||
/// let d2 = 0xb1b2;
|
||||
/// let d3 = 0xc1c2;
|
||||
/// let d4 = [0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8];
|
||||
///
|
||||
/// let uuid = Builder::from_fields_le(d1, d2, d3, &d4).into_uuid();
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// "a4a3a2a1-b2b1-c2c1-d1d2-d3d4d5d6d7d8"
|
||||
/// );
|
||||
/// ```
|
||||
pub const fn from_fields_le(d1: u32, d2: u16, d3: u16, d4: &[u8; 8]) -> Self {
|
||||
Builder(Uuid::from_fields_le(d1, d2, d3, d4))
|
||||
}
|
||||
|
||||
/// Creates a `Builder` from a 128bit value.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Builder;
|
||||
/// let v = 0xa1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8u128;
|
||||
///
|
||||
/// let uuid = Builder::from_u128(v).into_uuid();
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// ```
|
||||
pub const fn from_u128(v: u128) -> Self {
|
||||
Builder(Uuid::from_u128(v))
|
||||
}
|
||||
|
||||
/// Creates a UUID from a 128bit value in little-endian order.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Builder;
|
||||
/// let v = 0xa1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8u128;
|
||||
///
|
||||
/// let uuid = Builder::from_u128_le(v).into_uuid();
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "d8d7d6d5-d4d3-d2d1-c2c1-b2b1a4a3a2a1",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// ```
|
||||
pub const fn from_u128_le(v: u128) -> Self {
|
||||
Builder(Uuid::from_u128_le(v))
|
||||
}
|
||||
|
||||
/// Creates a `Builder` with an initial [`Uuid::nil`].
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Builder;
|
||||
/// let uuid = Builder::nil().into_uuid();
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// "00000000-0000-0000-0000-000000000000",
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// );
|
||||
/// ```
|
||||
pub const fn nil() -> Self {
|
||||
Builder(Uuid::nil())
|
||||
}
|
||||
|
||||
/// Specifies the variant of the UUID.
|
||||
pub fn set_variant(&mut self, v: Variant) -> &mut Self {
|
||||
*self = Builder(self.0).with_variant(v);
|
||||
self
|
||||
}
|
||||
|
||||
/// Specifies the variant of the UUID.
|
||||
pub const fn with_variant(mut self, v: Variant) -> Self {
|
||||
let byte = (self.0).0[8];
|
||||
|
||||
(self.0).0[8] = match v {
|
||||
Variant::NCS => byte & 0x7f,
|
||||
Variant::RFC4122 => (byte & 0x3f) | 0x80,
|
||||
Variant::Microsoft => (byte & 0x1f) | 0xc0,
|
||||
Variant::Future => byte | 0xe0,
|
||||
};
|
||||
|
||||
self
|
||||
}
|
||||
|
||||
/// Specifies the version number of the UUID.
|
||||
pub fn set_version(&mut self, v: Version) -> &mut Self {
|
||||
*self = Builder(self.0).with_version(v);
|
||||
self
|
||||
}
|
||||
|
||||
/// Specifies the version number of the UUID.
|
||||
pub const fn with_version(mut self, v: Version) -> Self {
|
||||
(self.0).0[6] = ((self.0).0[6] & 0x0f) | ((v as u8) << 4);
|
||||
|
||||
self
|
||||
}
|
||||
|
||||
/// Get a reference to the underlying [`Uuid`].
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Builder;
|
||||
/// let builder = Builder::nil();
|
||||
///
|
||||
/// let uuid1 = builder.as_uuid();
|
||||
/// let uuid2 = builder.as_uuid();
|
||||
///
|
||||
/// assert_eq!(uuid1, uuid2);
|
||||
/// ```
|
||||
pub const fn as_uuid(&self) -> &Uuid {
|
||||
&self.0
|
||||
}
|
||||
|
||||
/// Convert the builder into a [`Uuid`].
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::Builder;
|
||||
/// let uuid = Builder::nil().into_uuid();
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// "00000000-0000-0000-0000-000000000000"
|
||||
/// );
|
||||
/// ```
|
||||
pub const fn into_uuid(self) -> Uuid {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
172
third-party/vendor/uuid/src/error.rs
vendored
Normal file
172
third-party/vendor/uuid/src/error.rs
vendored
Normal file
|
|
@ -0,0 +1,172 @@
|
|||
use crate::std::fmt;
|
||||
|
||||
/// A general error that can occur when working with UUIDs.
|
||||
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
||||
pub struct Error(pub(crate) ErrorKind);
|
||||
|
||||
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
||||
pub(crate) enum ErrorKind {
|
||||
/// Invalid character in the [`Uuid`] string.
|
||||
///
|
||||
/// [`Uuid`]: ../struct.Uuid.html
|
||||
Char { character: char, index: usize },
|
||||
/// A simple [`Uuid`] didn't contain 32 characters.
|
||||
///
|
||||
/// [`Uuid`]: ../struct.Uuid.html
|
||||
SimpleLength { len: usize },
|
||||
/// A byte array didn't contain 16 bytes
|
||||
ByteLength { len: usize },
|
||||
/// A hyphenated [`Uuid`] didn't contain 5 groups
|
||||
///
|
||||
/// [`Uuid`]: ../struct.Uuid.html
|
||||
GroupCount { count: usize },
|
||||
/// A hyphenated [`Uuid`] had a group that wasn't the right length
|
||||
///
|
||||
/// [`Uuid`]: ../struct.Uuid.html
|
||||
GroupLength {
|
||||
group: usize,
|
||||
len: usize,
|
||||
index: usize,
|
||||
},
|
||||
/// The input was not a valid UTF8 string
|
||||
InvalidUTF8,
|
||||
/// Some other error occurred.
|
||||
Other,
|
||||
}
|
||||
|
||||
/// A string that is guaranteed to fail to parse to a [`Uuid`].
|
||||
///
|
||||
/// This type acts as a lightweight error indicator, suggesting
|
||||
/// that the string cannot be parsed but offering no error
|
||||
/// details. To get details, use `InvalidUuid::into_err`.
|
||||
///
|
||||
/// [`Uuid`]: ../struct.Uuid.html
|
||||
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
||||
pub struct InvalidUuid<'a>(pub(crate) &'a [u8]);
|
||||
|
||||
impl<'a> InvalidUuid<'a> {
|
||||
/// Converts the lightweight error type into detailed diagnostics.
|
||||
pub fn into_err(self) -> Error {
|
||||
// Check whether or not the input was ever actually a valid UTF8 string
|
||||
let input_str = match std::str::from_utf8(self.0) {
|
||||
Ok(s) => s,
|
||||
Err(_) => return Error(ErrorKind::InvalidUTF8),
|
||||
};
|
||||
|
||||
let (uuid_str, offset, simple) = match input_str.as_bytes() {
|
||||
[b'{', s @ .., b'}'] => (s, 1, false),
|
||||
[b'u', b'r', b'n', b':', b'u', b'u', b'i', b'd', b':', s @ ..] => {
|
||||
(s, "urn:uuid:".len(), false)
|
||||
}
|
||||
s => (s, 0, true),
|
||||
};
|
||||
|
||||
let mut hyphen_count = 0;
|
||||
let mut group_bounds = [0; 4];
|
||||
|
||||
// SAFETY: the byte array came from a valid utf8 string,
|
||||
// and is aligned along char boundaries.
|
||||
let uuid_str = unsafe { std::str::from_utf8_unchecked(uuid_str) };
|
||||
|
||||
for (index, character) in uuid_str.char_indices() {
|
||||
let byte = character as u8;
|
||||
if character as u32 - byte as u32 > 0 {
|
||||
// Multibyte char
|
||||
return Error(ErrorKind::Char {
|
||||
character,
|
||||
index: index + offset + 1,
|
||||
});
|
||||
} else if byte == b'-' {
|
||||
// While we search, also count group breaks
|
||||
if hyphen_count < 4 {
|
||||
group_bounds[hyphen_count] = index;
|
||||
}
|
||||
hyphen_count += 1;
|
||||
} else if !matches!(byte, b'0'..=b'9' | b'a'..=b'f' | b'A'..=b'F') {
|
||||
// Non-hex char
|
||||
return Error(ErrorKind::Char {
|
||||
character: byte as char,
|
||||
index: index + offset + 1,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if hyphen_count == 0 && simple {
|
||||
// This means that we tried and failed to parse a simple uuid.
|
||||
// Since we verified that all the characters are valid, this means
|
||||
// that it MUST have an invalid length.
|
||||
Error(ErrorKind::SimpleLength {
|
||||
len: input_str.len(),
|
||||
})
|
||||
} else if hyphen_count != 4 {
|
||||
// We tried to parse a hyphenated variant, but there weren't
|
||||
// 5 groups (4 hyphen splits).
|
||||
Error(ErrorKind::GroupCount {
|
||||
count: hyphen_count + 1,
|
||||
})
|
||||
} else {
|
||||
// There are 5 groups, one of them has an incorrect length
|
||||
const BLOCK_STARTS: [usize; 5] = [0, 9, 14, 19, 24];
|
||||
for i in 0..4 {
|
||||
if group_bounds[i] != BLOCK_STARTS[i + 1] - 1 {
|
||||
return Error(ErrorKind::GroupLength {
|
||||
group: i,
|
||||
len: group_bounds[i] - BLOCK_STARTS[i],
|
||||
index: offset + BLOCK_STARTS[i] + 1,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// The last group must be too long
|
||||
Error(ErrorKind::GroupLength {
|
||||
group: 4,
|
||||
len: input_str.len() - BLOCK_STARTS[4],
|
||||
index: offset + BLOCK_STARTS[4] + 1,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// NOTE: This impl is part of the public API. Breaking changes to it should be carefully considered
|
||||
impl fmt::Display for Error {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
match self.0 {
|
||||
ErrorKind::Char {
|
||||
character, index, ..
|
||||
} => {
|
||||
write!(f, "invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-fA-F-], found `{}` at {}", character, index)
|
||||
}
|
||||
ErrorKind::SimpleLength { len } => {
|
||||
write!(
|
||||
f,
|
||||
"invalid length: expected length 32 for simple format, found {}",
|
||||
len
|
||||
)
|
||||
}
|
||||
ErrorKind::ByteLength { len } => {
|
||||
write!(f, "invalid length: expected 16 bytes, found {}", len)
|
||||
}
|
||||
ErrorKind::GroupCount { count } => {
|
||||
write!(f, "invalid group count: expected 5, found {}", count)
|
||||
}
|
||||
ErrorKind::GroupLength { group, len, .. } => {
|
||||
let expected = [8, 4, 4, 4, 12][group];
|
||||
write!(
|
||||
f,
|
||||
"invalid group length in group {}: expected {}, found {}",
|
||||
group, expected, len
|
||||
)
|
||||
}
|
||||
ErrorKind::InvalidUTF8 => write!(f, "non-UTF8 input"),
|
||||
ErrorKind::Other => write!(f, "failed to parse a UUID"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
mod std_support {
|
||||
use super::*;
|
||||
use crate::std::error;
|
||||
|
||||
impl error::Error for Error {}
|
||||
}
|
||||
8
third-party/vendor/uuid/src/external.rs
vendored
Normal file
8
third-party/vendor/uuid/src/external.rs
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#[cfg(feature = "arbitrary")]
|
||||
pub(crate) mod arbitrary_support;
|
||||
#[cfg(feature = "borsh")]
|
||||
pub(crate) mod borsh_support;
|
||||
#[cfg(feature = "serde")]
|
||||
pub(crate) mod serde_support;
|
||||
#[cfg(feature = "slog")]
|
||||
pub(crate) mod slog_support;
|
||||
45
third-party/vendor/uuid/src/external/arbitrary_support.rs
vendored
Normal file
45
third-party/vendor/uuid/src/external/arbitrary_support.rs
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
use crate::{std::convert::TryInto, Builder, Uuid};
|
||||
|
||||
use arbitrary::{Arbitrary, Unstructured};
|
||||
|
||||
impl Arbitrary<'_> for Uuid {
|
||||
fn arbitrary(u: &mut Unstructured<'_>) -> arbitrary::Result<Self> {
|
||||
let b = u
|
||||
.bytes(16)?
|
||||
.try_into()
|
||||
.map_err(|_| arbitrary::Error::NotEnoughData)?;
|
||||
|
||||
Ok(Builder::from_random_bytes(b).into_uuid())
|
||||
}
|
||||
|
||||
fn size_hint(_: usize) -> (usize, Option<usize>) {
|
||||
(16, Some(16))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
use crate::{Variant, Version};
|
||||
|
||||
#[test]
|
||||
fn test_arbitrary() {
|
||||
let mut bytes = Unstructured::new(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
||||
|
||||
let uuid = Uuid::arbitrary(&mut bytes).unwrap();
|
||||
|
||||
assert_eq!(Some(Version::Random), uuid.get_version());
|
||||
assert_eq!(Variant::RFC4122, uuid.get_variant());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_arbitrary_empty() {
|
||||
let mut bytes = Unstructured::new(&[]);
|
||||
|
||||
// Ensure we don't panic when building an arbitrary `Uuid`
|
||||
let uuid = Uuid::arbitrary(&mut bytes);
|
||||
|
||||
assert!(uuid.is_err());
|
||||
}
|
||||
}
|
||||
23
third-party/vendor/uuid/src/external/borsh_support.rs
vendored
Normal file
23
third-party/vendor/uuid/src/external/borsh_support.rs
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
#[cfg(test)]
|
||||
mod borsh_tests {
|
||||
use crate::Uuid;
|
||||
use std::string::ToString;
|
||||
|
||||
#[test]
|
||||
fn test_serialize() {
|
||||
let uuid_str = "f9168c5e-ceb2-4faa-b6bf-329bf39fa1e4";
|
||||
let uuid = Uuid::parse_str(uuid_str).unwrap();
|
||||
let uuid_bytes = uuid.as_bytes().to_vec();
|
||||
let borsh_bytes = borsh::to_vec(&uuid).unwrap();
|
||||
assert_eq!(uuid_bytes, borsh_bytes);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_deserialize() {
|
||||
let uuid_str = "f9168c5e-ceb2-4faa-b6bf-329bf39fa1e4";
|
||||
let uuid = Uuid::parse_str(uuid_str).unwrap();
|
||||
let uuid_bytes = uuid.as_bytes().to_vec();
|
||||
let deserialized = borsh::from_slice::<Uuid>(&uuid_bytes).unwrap().to_string();
|
||||
assert_eq!(uuid_str, deserialized);
|
||||
}
|
||||
}
|
||||
313
third-party/vendor/uuid/src/external/serde_support.rs
vendored
Normal file
313
third-party/vendor/uuid/src/external/serde_support.rs
vendored
Normal file
|
|
@ -0,0 +1,313 @@
|
|||
// Copyright 2013-2014 The Rust Project Developers.
|
||||
// Copyright 2018 The Uuid Project Developers.
|
||||
//
|
||||
// See the COPYRIGHT file at the top-level directory of this distribution.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use crate::{
|
||||
error::*,
|
||||
fmt::{Braced, Hyphenated, Simple, Urn},
|
||||
std::fmt,
|
||||
Uuid,
|
||||
};
|
||||
use serde::{
|
||||
de::{self, Error as _},
|
||||
Deserialize, Deserializer, Serialize, Serializer,
|
||||
};
|
||||
|
||||
impl Serialize for Uuid {
|
||||
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
|
||||
if serializer.is_human_readable() {
|
||||
serializer.serialize_str(self.hyphenated().encode_lower(&mut Uuid::encode_buffer()))
|
||||
} else {
|
||||
serializer.serialize_bytes(self.as_bytes())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Serialize for Hyphenated {
|
||||
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
|
||||
serializer.serialize_str(self.encode_lower(&mut Uuid::encode_buffer()))
|
||||
}
|
||||
}
|
||||
|
||||
impl Serialize for Simple {
|
||||
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
|
||||
serializer.serialize_str(self.encode_lower(&mut Uuid::encode_buffer()))
|
||||
}
|
||||
}
|
||||
|
||||
impl Serialize for Urn {
|
||||
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
|
||||
serializer.serialize_str(self.encode_lower(&mut Uuid::encode_buffer()))
|
||||
}
|
||||
}
|
||||
|
||||
impl Serialize for Braced {
|
||||
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
|
||||
serializer.serialize_str(self.encode_lower(&mut Uuid::encode_buffer()))
|
||||
}
|
||||
}
|
||||
|
||||
impl<'de> Deserialize<'de> for Uuid {
|
||||
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
|
||||
fn de_error<E: de::Error>(e: Error) -> E {
|
||||
E::custom(format_args!("UUID parsing failed: {}", e))
|
||||
}
|
||||
|
||||
if deserializer.is_human_readable() {
|
||||
struct UuidVisitor;
|
||||
|
||||
impl<'vi> de::Visitor<'vi> for UuidVisitor {
|
||||
type Value = Uuid;
|
||||
|
||||
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(formatter, "a UUID string")
|
||||
}
|
||||
|
||||
fn visit_str<E: de::Error>(self, value: &str) -> Result<Uuid, E> {
|
||||
value.parse::<Uuid>().map_err(de_error)
|
||||
}
|
||||
|
||||
fn visit_bytes<E: de::Error>(self, value: &[u8]) -> Result<Uuid, E> {
|
||||
Uuid::from_slice(value).map_err(de_error)
|
||||
}
|
||||
|
||||
fn visit_seq<A>(self, mut seq: A) -> Result<Uuid, A::Error>
|
||||
where
|
||||
A: de::SeqAccess<'vi>,
|
||||
{
|
||||
#[rustfmt::skip]
|
||||
let bytes = [
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
match seq.next_element()? { Some(e) => e, None => return Err(A::Error::invalid_length(16, &self)) },
|
||||
];
|
||||
|
||||
Ok(Uuid::from_bytes(bytes))
|
||||
}
|
||||
}
|
||||
|
||||
deserializer.deserialize_str(UuidVisitor)
|
||||
} else {
|
||||
struct UuidBytesVisitor;
|
||||
|
||||
impl<'vi> de::Visitor<'vi> for UuidBytesVisitor {
|
||||
type Value = Uuid;
|
||||
|
||||
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(formatter, "bytes")
|
||||
}
|
||||
|
||||
fn visit_bytes<E: de::Error>(self, value: &[u8]) -> Result<Uuid, E> {
|
||||
Uuid::from_slice(value).map_err(de_error)
|
||||
}
|
||||
}
|
||||
|
||||
deserializer.deserialize_bytes(UuidBytesVisitor)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub mod compact {
|
||||
//! Serialize a [`Uuid`] as a `[u8; 16]`.
|
||||
//!
|
||||
//! [`Uuid`]: ../../struct.Uuid.html
|
||||
|
||||
/// Serialize from a [`Uuid`] as a `[u8; 16]`
|
||||
///
|
||||
/// [`Uuid`]: ../../struct.Uuid.html
|
||||
pub fn serialize<S>(u: &crate::Uuid, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: serde::Serializer,
|
||||
{
|
||||
serde::Serialize::serialize(u.as_bytes(), serializer)
|
||||
}
|
||||
|
||||
/// Deserialize a `[u8; 16]` as a [`Uuid`]
|
||||
///
|
||||
/// [`Uuid`]: ../../struct.Uuid.html
|
||||
pub fn deserialize<'de, D>(deserializer: D) -> Result<crate::Uuid, D::Error>
|
||||
where
|
||||
D: serde::Deserializer<'de>,
|
||||
{
|
||||
let bytes: [u8; 16] = serde::Deserialize::deserialize(deserializer)?;
|
||||
|
||||
Ok(crate::Uuid::from_bytes(bytes))
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use serde_derive::*;
|
||||
use serde_test::{self, Configure};
|
||||
|
||||
#[test]
|
||||
fn test_serialize_compact() {
|
||||
#[derive(Serialize, Debug, Deserialize, PartialEq)]
|
||||
struct UuidContainer {
|
||||
#[serde(with = "crate::serde::compact")]
|
||||
u: crate::Uuid,
|
||||
}
|
||||
|
||||
let uuid_bytes = b"F9168C5E-CEB2-4F";
|
||||
let container = UuidContainer {
|
||||
u: crate::Uuid::from_slice(uuid_bytes).unwrap(),
|
||||
};
|
||||
|
||||
// more complex because of the struct wrapping the actual UUID
|
||||
// serialization
|
||||
serde_test::assert_tokens(
|
||||
&container.compact(),
|
||||
&[
|
||||
serde_test::Token::Struct {
|
||||
name: "UuidContainer",
|
||||
len: 1,
|
||||
},
|
||||
serde_test::Token::Str("u"),
|
||||
serde_test::Token::Tuple { len: 16 },
|
||||
serde_test::Token::U8(uuid_bytes[0]),
|
||||
serde_test::Token::U8(uuid_bytes[1]),
|
||||
serde_test::Token::U8(uuid_bytes[2]),
|
||||
serde_test::Token::U8(uuid_bytes[3]),
|
||||
serde_test::Token::U8(uuid_bytes[4]),
|
||||
serde_test::Token::U8(uuid_bytes[5]),
|
||||
serde_test::Token::U8(uuid_bytes[6]),
|
||||
serde_test::Token::U8(uuid_bytes[7]),
|
||||
serde_test::Token::U8(uuid_bytes[8]),
|
||||
serde_test::Token::U8(uuid_bytes[9]),
|
||||
serde_test::Token::U8(uuid_bytes[10]),
|
||||
serde_test::Token::U8(uuid_bytes[11]),
|
||||
serde_test::Token::U8(uuid_bytes[12]),
|
||||
serde_test::Token::U8(uuid_bytes[13]),
|
||||
serde_test::Token::U8(uuid_bytes[14]),
|
||||
serde_test::Token::U8(uuid_bytes[15]),
|
||||
serde_test::Token::TupleEnd,
|
||||
serde_test::Token::StructEnd,
|
||||
],
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod serde_tests {
|
||||
use super::*;
|
||||
|
||||
use serde_test::{Compact, Configure, Readable, Token};
|
||||
|
||||
#[test]
|
||||
fn test_serialize_readable_string() {
|
||||
let uuid_str = "f9168c5e-ceb2-4faa-b6bf-329bf39fa1e4";
|
||||
let u = Uuid::parse_str(uuid_str).unwrap();
|
||||
serde_test::assert_tokens(&u.readable(), &[Token::Str(uuid_str)]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_deserialize_readable_compact() {
|
||||
let uuid_bytes = b"F9168C5E-CEB2-4F";
|
||||
let u = Uuid::from_slice(uuid_bytes).unwrap();
|
||||
|
||||
serde_test::assert_de_tokens(
|
||||
&u.readable(),
|
||||
&[
|
||||
serde_test::Token::Tuple { len: 16 },
|
||||
serde_test::Token::U8(uuid_bytes[0]),
|
||||
serde_test::Token::U8(uuid_bytes[1]),
|
||||
serde_test::Token::U8(uuid_bytes[2]),
|
||||
serde_test::Token::U8(uuid_bytes[3]),
|
||||
serde_test::Token::U8(uuid_bytes[4]),
|
||||
serde_test::Token::U8(uuid_bytes[5]),
|
||||
serde_test::Token::U8(uuid_bytes[6]),
|
||||
serde_test::Token::U8(uuid_bytes[7]),
|
||||
serde_test::Token::U8(uuid_bytes[8]),
|
||||
serde_test::Token::U8(uuid_bytes[9]),
|
||||
serde_test::Token::U8(uuid_bytes[10]),
|
||||
serde_test::Token::U8(uuid_bytes[11]),
|
||||
serde_test::Token::U8(uuid_bytes[12]),
|
||||
serde_test::Token::U8(uuid_bytes[13]),
|
||||
serde_test::Token::U8(uuid_bytes[14]),
|
||||
serde_test::Token::U8(uuid_bytes[15]),
|
||||
serde_test::Token::TupleEnd,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_deserialize_readable_bytes() {
|
||||
let uuid_bytes = b"F9168C5E-CEB2-4F";
|
||||
let u = Uuid::from_slice(uuid_bytes).unwrap();
|
||||
|
||||
serde_test::assert_de_tokens(&u.readable(), &[serde_test::Token::Bytes(uuid_bytes)]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_serialize_hyphenated() {
|
||||
let uuid_str = "f9168c5e-ceb2-4faa-b6bf-329bf39fa1e4";
|
||||
let u = Uuid::parse_str(uuid_str).unwrap();
|
||||
serde_test::assert_ser_tokens(&u.hyphenated(), &[Token::Str(uuid_str)]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_serialize_simple() {
|
||||
let uuid_str = "f9168c5eceb24faab6bf329bf39fa1e4";
|
||||
let u = Uuid::parse_str(uuid_str).unwrap();
|
||||
serde_test::assert_ser_tokens(&u.simple(), &[Token::Str(uuid_str)]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_serialize_urn() {
|
||||
let uuid_str = "urn:uuid:f9168c5e-ceb2-4faa-b6bf-329bf39fa1e4";
|
||||
let u = Uuid::parse_str(uuid_str).unwrap();
|
||||
serde_test::assert_ser_tokens(&u.urn(), &[Token::Str(uuid_str)]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_serialize_braced() {
|
||||
let uuid_str = "{f9168c5e-ceb2-4faa-b6bf-329bf39fa1e4}";
|
||||
let u = Uuid::parse_str(uuid_str).unwrap();
|
||||
serde_test::assert_ser_tokens(&u.braced(), &[Token::Str(uuid_str)]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_serialize_non_human_readable() {
|
||||
let uuid_bytes = b"F9168C5E-CEB2-4F";
|
||||
let u = Uuid::from_slice(uuid_bytes).unwrap();
|
||||
serde_test::assert_tokens(
|
||||
&u.compact(),
|
||||
&[serde_test::Token::Bytes(&[
|
||||
70, 57, 49, 54, 56, 67, 53, 69, 45, 67, 69, 66, 50, 45, 52, 70,
|
||||
])],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_de_failure() {
|
||||
serde_test::assert_de_tokens_error::<Readable<Uuid>>(
|
||||
&[Token::Str("hello_world")],
|
||||
"UUID parsing failed: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-fA-F-], found `h` at 1",
|
||||
);
|
||||
|
||||
serde_test::assert_de_tokens_error::<Compact<Uuid>>(
|
||||
&[Token::Bytes(b"hello_world")],
|
||||
"UUID parsing failed: invalid length: expected 16 bytes, found 11",
|
||||
);
|
||||
}
|
||||
}
|
||||
37
third-party/vendor/uuid/src/external/slog_support.rs
vendored
Normal file
37
third-party/vendor/uuid/src/external/slog_support.rs
vendored
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
// Copyright 2013-2014 The Rust Project Developers.
|
||||
// Copyright 2018 The Uuid Project Developers.
|
||||
//
|
||||
// See the COPYRIGHT file at the top-level directory of this distribution.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use crate::Uuid;
|
||||
|
||||
impl slog::Value for Uuid {
|
||||
fn serialize(
|
||||
&self,
|
||||
_: &slog::Record<'_>,
|
||||
key: slog::Key,
|
||||
serializer: &mut dyn slog::Serializer,
|
||||
) -> Result<(), slog::Error> {
|
||||
serializer.emit_arguments(key, &format_args!("{}", self))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::tests::new;
|
||||
|
||||
use slog::{self, crit, Drain};
|
||||
|
||||
#[test]
|
||||
fn test_slog_kv() {
|
||||
let root = slog::Logger::root(slog::Discard.fuse(), slog::o!());
|
||||
let u1 = new();
|
||||
crit!(root, "test"; "u1" => u1);
|
||||
}
|
||||
}
|
||||
1040
third-party/vendor/uuid/src/fmt.rs
vendored
Normal file
1040
third-party/vendor/uuid/src/fmt.rs
vendored
Normal file
File diff suppressed because it is too large
Load diff
1845
third-party/vendor/uuid/src/lib.rs
vendored
Normal file
1845
third-party/vendor/uuid/src/lib.rs
vendored
Normal file
File diff suppressed because it is too large
Load diff
92
third-party/vendor/uuid/src/macros.rs
vendored
Normal file
92
third-party/vendor/uuid/src/macros.rs
vendored
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
macro_rules! define_uuid_macro {
|
||||
{$(#[$doc:meta])*} => {
|
||||
$(#[$doc])*
|
||||
#[cfg(feature = "macro-diagnostics")]
|
||||
#[macro_export]
|
||||
macro_rules! uuid {
|
||||
($uuid:literal) => {{
|
||||
$crate::Uuid::from_bytes($crate::uuid_macro_internal::parse_lit!($uuid))
|
||||
}};
|
||||
}
|
||||
|
||||
$(#[$doc])*
|
||||
#[cfg(not(feature = "macro-diagnostics"))]
|
||||
#[macro_export]
|
||||
macro_rules! uuid {
|
||||
($uuid:literal) => {{
|
||||
const OUTPUT: $crate::Uuid = match $crate::Uuid::try_parse($uuid) {
|
||||
$crate::__macro_support::Ok(u) => u,
|
||||
$crate::__macro_support::Err(_) => panic!("invalid UUID"),
|
||||
};
|
||||
OUTPUT
|
||||
}};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
define_uuid_macro! {
|
||||
/// Parse [`Uuid`][uuid::Uuid]s from string literals at compile time.
|
||||
///
|
||||
/// ## Usage
|
||||
///
|
||||
/// This macro transforms the string literal representation of a
|
||||
/// [`Uuid`][uuid::Uuid] into the bytes representation, raising a compilation
|
||||
/// error if it cannot properly be parsed.
|
||||
///
|
||||
/// ## Examples
|
||||
///
|
||||
/// Setting a global constant:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::{uuid, Uuid};
|
||||
/// pub const SCHEMA_ATTR_CLASS: Uuid = uuid!("00000000-0000-0000-0000-ffff00000000");
|
||||
/// pub const SCHEMA_ATTR_UUID: Uuid = uuid!("00000000-0000-0000-0000-ffff00000001");
|
||||
/// pub const SCHEMA_ATTR_NAME: Uuid = uuid!("00000000-0000-0000-0000-ffff00000002");
|
||||
/// ```
|
||||
///
|
||||
/// Defining a local variable:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::uuid;
|
||||
/// let uuid = uuid!("urn:uuid:F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4");
|
||||
/// ```
|
||||
///
|
||||
/// ## Compilation Failures
|
||||
///
|
||||
/// Invalid UUIDs are rejected:
|
||||
///
|
||||
/// ```compile_fail
|
||||
/// # use uuid::uuid;
|
||||
/// let uuid = uuid!("F9168C5E-ZEB2-4FAA-B6BF-329BF39FA1E4");
|
||||
/// ```
|
||||
///
|
||||
/// Enable the feature `macro-diagnostics` to see the error messages below.
|
||||
///
|
||||
/// Provides the following compilation error:
|
||||
///
|
||||
/// ```txt
|
||||
/// error: invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-fA-F-], found Z at 9
|
||||
/// |
|
||||
/// | let id = uuid!("F9168C5E-ZEB2-4FAA-B6BF-329BF39FA1E4");
|
||||
/// | ^
|
||||
/// ```
|
||||
///
|
||||
/// Tokens that aren't string literals are also rejected:
|
||||
///
|
||||
/// ```compile_fail
|
||||
/// # use uuid::uuid;
|
||||
/// let uuid_str: &str = "550e8400e29b41d4a716446655440000";
|
||||
/// let uuid = uuid!(uuid_str);
|
||||
/// ```
|
||||
///
|
||||
/// Provides the following compilation error:
|
||||
///
|
||||
/// ```txt
|
||||
/// error: expected string literal
|
||||
/// |
|
||||
/// | let uuid = uuid!(uuid_str);
|
||||
/// | ^^^^^^^^
|
||||
/// ```
|
||||
///
|
||||
/// [uuid::Uuid]: https://docs.rs/uuid/*/uuid/struct.Uuid.html
|
||||
}
|
||||
14
third-party/vendor/uuid/src/md5.rs
vendored
Normal file
14
third-party/vendor/uuid/src/md5.rs
vendored
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
#[cfg(feature = "v3")]
|
||||
pub(crate) fn hash(ns: &[u8], src: &[u8]) -> [u8; 16] {
|
||||
use md5::{Digest, Md5};
|
||||
|
||||
let mut hasher = Md5::new();
|
||||
|
||||
hasher.update(ns);
|
||||
hasher.update(src);
|
||||
|
||||
let mut bytes = [0; 16];
|
||||
bytes.copy_from_slice(&hasher.finalize()[..16]);
|
||||
|
||||
bytes
|
||||
}
|
||||
529
third-party/vendor/uuid/src/parser.rs
vendored
Normal file
529
third-party/vendor/uuid/src/parser.rs
vendored
Normal file
|
|
@ -0,0 +1,529 @@
|
|||
// Copyright 2013-2014 The Rust Project Developers.
|
||||
// Copyright 2018 The Uuid Project Developers.
|
||||
//
|
||||
// See the COPYRIGHT file at the top-level directory of this distribution.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
//! [`Uuid`] parsing constructs and utilities.
|
||||
//!
|
||||
//! [`Uuid`]: ../struct.Uuid.html
|
||||
|
||||
use crate::{
|
||||
error::*,
|
||||
std::{convert::TryFrom, str},
|
||||
Uuid,
|
||||
};
|
||||
|
||||
impl str::FromStr for Uuid {
|
||||
type Err = Error;
|
||||
|
||||
fn from_str(uuid_str: &str) -> Result<Self, Self::Err> {
|
||||
Uuid::parse_str(uuid_str)
|
||||
}
|
||||
}
|
||||
|
||||
impl TryFrom<&'_ str> for Uuid {
|
||||
type Error = Error;
|
||||
|
||||
fn try_from(uuid_str: &'_ str) -> Result<Self, Self::Error> {
|
||||
Uuid::parse_str(uuid_str)
|
||||
}
|
||||
}
|
||||
|
||||
impl Uuid {
|
||||
/// Parses a `Uuid` from a string of hexadecimal digits with optional
|
||||
/// hyphens.
|
||||
///
|
||||
/// Any of the formats generated by this module (simple, hyphenated, urn,
|
||||
/// Microsoft GUID) are supported by this parsing function.
|
||||
///
|
||||
/// Prefer [`try_parse`] unless you need detailed user-facing diagnostics.
|
||||
/// This method will be eventually deprecated in favor of `try_parse`.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Parse a hyphenated UUID:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::{Uuid, Version, Variant};
|
||||
/// # fn main() -> Result<(), uuid::Error> {
|
||||
/// let uuid = Uuid::parse_str("550e8400-e29b-41d4-a716-446655440000")?;
|
||||
///
|
||||
/// assert_eq!(Some(Version::Random), uuid.get_version());
|
||||
/// assert_eq!(Variant::RFC4122, uuid.get_variant());
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
///
|
||||
/// [`try_parse`]: #method.try_parse
|
||||
pub fn parse_str(input: &str) -> Result<Uuid, Error> {
|
||||
try_parse(input.as_bytes())
|
||||
.map(Uuid::from_bytes)
|
||||
.map_err(InvalidUuid::into_err)
|
||||
}
|
||||
|
||||
/// Parses a `Uuid` from a string of hexadecimal digits with optional
|
||||
/// hyphens.
|
||||
///
|
||||
/// This function is similar to [`parse_str`], in fact `parse_str` shares
|
||||
/// the same underlying parser. The difference is that if `try_parse`
|
||||
/// fails, it won't generate very useful error messages. The `parse_str`
|
||||
/// function will eventually be deprecated in favor or `try_parse`.
|
||||
///
|
||||
/// To parse a UUID from a byte stream instead of a UTF8 string, see
|
||||
/// [`try_parse_ascii`].
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Parse a hyphenated UUID:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::{Uuid, Version, Variant};
|
||||
/// # fn main() -> Result<(), uuid::Error> {
|
||||
/// let uuid = Uuid::try_parse("550e8400-e29b-41d4-a716-446655440000")?;
|
||||
///
|
||||
/// assert_eq!(Some(Version::Random), uuid.get_version());
|
||||
/// assert_eq!(Variant::RFC4122, uuid.get_variant());
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
///
|
||||
/// [`parse_str`]: #method.parse_str
|
||||
/// [`try_parse_ascii`]: #method.try_parse_ascii
|
||||
pub const fn try_parse(input: &str) -> Result<Uuid, Error> {
|
||||
Self::try_parse_ascii(input.as_bytes())
|
||||
}
|
||||
|
||||
/// Parses a `Uuid` from a string of hexadecimal digits with optional
|
||||
/// hyphens.
|
||||
///
|
||||
/// The input is expected to be a string of ASCII characters. This method
|
||||
/// can be more convenient than [`try_parse`] if the UUID is being
|
||||
/// parsed from a byte stream instead of from a UTF8 string.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Parse a hyphenated UUID:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::{Uuid, Version, Variant};
|
||||
/// # fn main() -> Result<(), uuid::Error> {
|
||||
/// let uuid = Uuid::try_parse_ascii(b"550e8400-e29b-41d4-a716-446655440000")?;
|
||||
///
|
||||
/// assert_eq!(Some(Version::Random), uuid.get_version());
|
||||
/// assert_eq!(Variant::RFC4122, uuid.get_variant());
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
///
|
||||
/// [`try_parse`]: #method.try_parse
|
||||
pub const fn try_parse_ascii(input: &[u8]) -> Result<Uuid, Error> {
|
||||
match try_parse(input) {
|
||||
Ok(bytes) => Ok(Uuid::from_bytes(bytes)),
|
||||
// If parsing fails then we don't know exactly what went wrong
|
||||
// In this case, we just return a generic error
|
||||
Err(_) => Err(Error(ErrorKind::Other)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const fn try_parse(input: &[u8]) -> Result<[u8; 16], InvalidUuid> {
|
||||
let result = match (input.len(), input) {
|
||||
// Inputs of 32 bytes must be a non-hyphenated UUID
|
||||
(32, s) => parse_simple(s),
|
||||
// Hyphenated UUIDs may be wrapped in various ways:
|
||||
// - `{UUID}` for braced UUIDs
|
||||
// - `urn:uuid:UUID` for URNs
|
||||
// - `UUID` for a regular hyphenated UUID
|
||||
(36, s)
|
||||
| (38, [b'{', s @ .., b'}'])
|
||||
| (45, [b'u', b'r', b'n', b':', b'u', b'u', b'i', b'd', b':', s @ ..]) => {
|
||||
parse_hyphenated(s)
|
||||
}
|
||||
// Any other shaped input is immediately invalid
|
||||
_ => Err(()),
|
||||
};
|
||||
|
||||
match result {
|
||||
Ok(b) => Ok(b),
|
||||
Err(()) => Err(InvalidUuid(input)),
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
const fn parse_simple(s: &[u8]) -> Result<[u8; 16], ()> {
|
||||
// This length check here removes all other bounds
|
||||
// checks in this function
|
||||
if s.len() != 32 {
|
||||
return Err(());
|
||||
}
|
||||
|
||||
let mut buf: [u8; 16] = [0; 16];
|
||||
let mut i = 0;
|
||||
|
||||
while i < 16 {
|
||||
// Convert a two-char hex value (like `A8`)
|
||||
// into a byte (like `10101000`)
|
||||
let h1 = HEX_TABLE[s[i * 2] as usize];
|
||||
let h2 = HEX_TABLE[s[i * 2 + 1] as usize];
|
||||
|
||||
// We use `0xff` as a sentinel value to indicate
|
||||
// an invalid hex character sequence (like the letter `G`)
|
||||
if h1 | h2 == 0xff {
|
||||
return Err(());
|
||||
}
|
||||
|
||||
// The upper nibble needs to be shifted into position
|
||||
// to produce the final byte value
|
||||
buf[i] = SHL4_TABLE[h1 as usize] | h2;
|
||||
i += 1;
|
||||
}
|
||||
|
||||
Ok(buf)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
const fn parse_hyphenated(s: &[u8]) -> Result<[u8; 16], ()> {
|
||||
// This length check here removes all other bounds
|
||||
// checks in this function
|
||||
if s.len() != 36 {
|
||||
return Err(());
|
||||
}
|
||||
|
||||
// We look at two hex-encoded values (4 chars) at a time because
|
||||
// that's the size of the smallest group in a hyphenated UUID.
|
||||
// The indexes we're interested in are:
|
||||
//
|
||||
// uuid : 936da01f-9abd-4d9d-80c7-02af85c822a8
|
||||
// | | || || || || | |
|
||||
// hyphens : | | 8| 13| 18| 23| | |
|
||||
// positions: 0 4 9 14 19 24 28 32
|
||||
|
||||
// First, ensure the hyphens appear in the right places
|
||||
match [s[8], s[13], s[18], s[23]] {
|
||||
[b'-', b'-', b'-', b'-'] => {}
|
||||
_ => return Err(()),
|
||||
}
|
||||
|
||||
let positions: [u8; 8] = [0, 4, 9, 14, 19, 24, 28, 32];
|
||||
let mut buf: [u8; 16] = [0; 16];
|
||||
let mut j = 0;
|
||||
|
||||
while j < 8 {
|
||||
let i = positions[j];
|
||||
|
||||
// The decoding here is the same as the simple case
|
||||
// We're just dealing with two values instead of one
|
||||
let h1 = HEX_TABLE[s[i as usize] as usize];
|
||||
let h2 = HEX_TABLE[s[(i + 1) as usize] as usize];
|
||||
let h3 = HEX_TABLE[s[(i + 2) as usize] as usize];
|
||||
let h4 = HEX_TABLE[s[(i + 3) as usize] as usize];
|
||||
|
||||
if h1 | h2 | h3 | h4 == 0xff {
|
||||
return Err(());
|
||||
}
|
||||
|
||||
buf[j * 2] = SHL4_TABLE[h1 as usize] | h2;
|
||||
buf[j * 2 + 1] = SHL4_TABLE[h3 as usize] | h4;
|
||||
j += 1;
|
||||
}
|
||||
|
||||
Ok(buf)
|
||||
}
|
||||
|
||||
const HEX_TABLE: &[u8; 256] = &{
|
||||
let mut buf = [0; 256];
|
||||
let mut i: u8 = 0;
|
||||
|
||||
loop {
|
||||
buf[i as usize] = match i {
|
||||
b'0'..=b'9' => i - b'0',
|
||||
b'a'..=b'f' => i - b'a' + 10,
|
||||
b'A'..=b'F' => i - b'A' + 10,
|
||||
_ => 0xff,
|
||||
};
|
||||
|
||||
if i == 255 {
|
||||
break buf;
|
||||
}
|
||||
|
||||
i += 1
|
||||
}
|
||||
};
|
||||
|
||||
const SHL4_TABLE: &[u8; 256] = &{
|
||||
let mut buf = [0; 256];
|
||||
let mut i: u8 = 0;
|
||||
|
||||
loop {
|
||||
buf[i as usize] = i.wrapping_shl(4);
|
||||
|
||||
if i == 255 {
|
||||
break buf;
|
||||
}
|
||||
|
||||
i += 1;
|
||||
}
|
||||
};
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::{std::string::ToString, tests::new};
|
||||
|
||||
#[test]
|
||||
fn test_parse_uuid_v4_valid() {
|
||||
let from_hyphenated = Uuid::parse_str("67e55044-10b1-426f-9247-bb680e5fe0c8").unwrap();
|
||||
let from_simple = Uuid::parse_str("67e5504410b1426f9247bb680e5fe0c8").unwrap();
|
||||
let from_urn = Uuid::parse_str("urn:uuid:67e55044-10b1-426f-9247-bb680e5fe0c8").unwrap();
|
||||
let from_guid = Uuid::parse_str("{67e55044-10b1-426f-9247-bb680e5fe0c8}").unwrap();
|
||||
|
||||
assert_eq!(from_hyphenated, from_simple);
|
||||
assert_eq!(from_hyphenated, from_urn);
|
||||
assert_eq!(from_hyphenated, from_guid);
|
||||
|
||||
assert!(Uuid::parse_str("00000000000000000000000000000000").is_ok());
|
||||
assert!(Uuid::parse_str("67e55044-10b1-426f-9247-bb680e5fe0c8").is_ok());
|
||||
assert!(Uuid::parse_str("F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4").is_ok());
|
||||
assert!(Uuid::parse_str("67e5504410b1426f9247bb680e5fe0c8").is_ok());
|
||||
assert!(Uuid::parse_str("01020304-1112-2122-3132-414243444546").is_ok());
|
||||
assert!(Uuid::parse_str("urn:uuid:67e55044-10b1-426f-9247-bb680e5fe0c8").is_ok());
|
||||
assert!(Uuid::parse_str("{6d93bade-bd9f-4e13-8914-9474e1e3567b}").is_ok());
|
||||
|
||||
// Nil
|
||||
let nil = Uuid::nil();
|
||||
assert_eq!(
|
||||
Uuid::parse_str("00000000000000000000000000000000").unwrap(),
|
||||
nil
|
||||
);
|
||||
assert_eq!(
|
||||
Uuid::parse_str("00000000-0000-0000-0000-000000000000").unwrap(),
|
||||
nil
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_uuid_v4_invalid() {
|
||||
// Invalid
|
||||
assert_eq!(
|
||||
Uuid::parse_str(""),
|
||||
Err(Error(ErrorKind::SimpleLength { len: 0 }))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("!"),
|
||||
Err(Error(ErrorKind::Char {
|
||||
character: '!',
|
||||
index: 1,
|
||||
}))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("F9168C5E-CEB2-4faa-B6BF-329BF39FA1E45"),
|
||||
Err(Error(ErrorKind::GroupLength {
|
||||
group: 4,
|
||||
len: 13,
|
||||
index: 25,
|
||||
}))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("F9168C5E-CEB2-4faa-BBF-329BF39FA1E4"),
|
||||
Err(Error(ErrorKind::GroupLength {
|
||||
group: 3,
|
||||
len: 3,
|
||||
index: 20,
|
||||
}))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("F9168C5E-CEB2-4faa-BGBF-329BF39FA1E4"),
|
||||
Err(Error(ErrorKind::Char {
|
||||
character: 'G',
|
||||
index: 21,
|
||||
}))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("F9168C5E-CEB2F4faaFB6BFF329BF39FA1E4"),
|
||||
Err(Error(ErrorKind::GroupCount { count: 2 }))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("F9168C5E-CEB2-4faaFB6BFF329BF39FA1E4"),
|
||||
Err(Error(ErrorKind::GroupCount { count: 3 }))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("F9168C5E-CEB2-4faa-B6BFF329BF39FA1E4"),
|
||||
Err(Error(ErrorKind::GroupCount { count: 4 }))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("F9168C5E-CEB2-4faa"),
|
||||
Err(Error(ErrorKind::GroupCount { count: 3 }))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("F9168C5E-CEB2-4faaXB6BFF329BF39FA1E4"),
|
||||
Err(Error(ErrorKind::Char {
|
||||
character: 'X',
|
||||
index: 19,
|
||||
}))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("{F9168C5E-CEB2-4faa9B6BFF329BF39FA1E41"),
|
||||
Err(Error(ErrorKind::Char {
|
||||
character: '{',
|
||||
index: 1,
|
||||
}))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("{F9168C5E-CEB2-4faa9B6BFF329BF39FA1E41}"),
|
||||
Err(Error(ErrorKind::GroupCount { count: 3 }))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("F9168C5E-CEB-24fa-eB6BFF32-BF39FA1E4"),
|
||||
Err(Error(ErrorKind::GroupLength {
|
||||
group: 1,
|
||||
len: 3,
|
||||
index: 10,
|
||||
}))
|
||||
);
|
||||
|
||||
// // (group, found, expecting)
|
||||
// //
|
||||
assert_eq!(
|
||||
Uuid::parse_str("01020304-1112-2122-3132-41424344"),
|
||||
Err(Error(ErrorKind::GroupLength {
|
||||
group: 4,
|
||||
len: 8,
|
||||
index: 25,
|
||||
}))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("67e5504410b1426f9247bb680e5fe0c"),
|
||||
Err(Error(ErrorKind::SimpleLength { len: 31 }))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("67e5504410b1426f9247bb680e5fe0c88"),
|
||||
Err(Error(ErrorKind::SimpleLength { len: 33 }))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("67e5504410b1426f9247bb680e5fe0cg8"),
|
||||
Err(Error(ErrorKind::Char {
|
||||
character: 'g',
|
||||
index: 32,
|
||||
}))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("67e5504410b1426%9247bb680e5fe0c8"),
|
||||
Err(Error(ErrorKind::Char {
|
||||
character: '%',
|
||||
index: 16,
|
||||
}))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("231231212212423424324323477343246663"),
|
||||
Err(Error(ErrorKind::SimpleLength { len: 36 }))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("{00000000000000000000000000000000}"),
|
||||
Err(Error(ErrorKind::GroupCount { count: 1 }))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("67e5504410b1426f9247bb680e5fe0c"),
|
||||
Err(Error(ErrorKind::SimpleLength { len: 31 }))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("67e550X410b1426f9247bb680e5fe0cd"),
|
||||
Err(Error(ErrorKind::Char {
|
||||
character: 'X',
|
||||
index: 7,
|
||||
}))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("67e550-4105b1426f9247bb680e5fe0c"),
|
||||
Err(Error(ErrorKind::GroupCount { count: 2 }))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("F9168C5E-CEB2-4faa-B6BF1-02BF39FA1E4"),
|
||||
Err(Error(ErrorKind::GroupLength {
|
||||
group: 3,
|
||||
len: 5,
|
||||
index: 20,
|
||||
}))
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Uuid::parse_str("\u{bcf3c}"),
|
||||
Err(Error(ErrorKind::Char {
|
||||
character: '\u{bcf3c}',
|
||||
index: 1
|
||||
}))
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_roundtrip_default() {
|
||||
let uuid_orig = new();
|
||||
let orig_str = uuid_orig.to_string();
|
||||
let uuid_out = Uuid::parse_str(&orig_str).unwrap();
|
||||
assert_eq!(uuid_orig, uuid_out);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_roundtrip_hyphenated() {
|
||||
let uuid_orig = new();
|
||||
let orig_str = uuid_orig.hyphenated().to_string();
|
||||
let uuid_out = Uuid::parse_str(&orig_str).unwrap();
|
||||
assert_eq!(uuid_orig, uuid_out);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_roundtrip_simple() {
|
||||
let uuid_orig = new();
|
||||
let orig_str = uuid_orig.simple().to_string();
|
||||
let uuid_out = Uuid::parse_str(&orig_str).unwrap();
|
||||
assert_eq!(uuid_orig, uuid_out);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_roundtrip_urn() {
|
||||
let uuid_orig = new();
|
||||
let orig_str = uuid_orig.urn().to_string();
|
||||
let uuid_out = Uuid::parse_str(&orig_str).unwrap();
|
||||
assert_eq!(uuid_orig, uuid_out);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_roundtrip_braced() {
|
||||
let uuid_orig = new();
|
||||
let orig_str = uuid_orig.braced().to_string();
|
||||
let uuid_out = Uuid::parse_str(&orig_str).unwrap();
|
||||
assert_eq!(uuid_orig, uuid_out);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_try_parse_ascii_non_utf8() {
|
||||
assert!(Uuid::try_parse_ascii(b"67e55044-10b1-426f-9247-bb680e5\0e0c8").is_err());
|
||||
}
|
||||
}
|
||||
39
third-party/vendor/uuid/src/rng.rs
vendored
Normal file
39
third-party/vendor/uuid/src/rng.rs
vendored
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
#[cfg(any(feature = "v4", feature = "v7"))]
|
||||
pub(crate) fn bytes() -> [u8; 16] {
|
||||
#[cfg(not(feature = "fast-rng"))]
|
||||
{
|
||||
let mut bytes = [0u8; 16];
|
||||
|
||||
getrandom::getrandom(&mut bytes).unwrap_or_else(|err| {
|
||||
// NB: getrandom::Error has no source; this is adequate display
|
||||
panic!("could not retrieve random bytes for uuid: {}", err)
|
||||
});
|
||||
|
||||
bytes
|
||||
}
|
||||
|
||||
#[cfg(feature = "fast-rng")]
|
||||
{
|
||||
rand::random()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "v1", feature = "v6"))]
|
||||
pub(crate) fn u16() -> u16 {
|
||||
#[cfg(not(feature = "fast-rng"))]
|
||||
{
|
||||
let mut bytes = [0u8; 2];
|
||||
|
||||
getrandom::getrandom(&mut bytes).unwrap_or_else(|err| {
|
||||
// NB: getrandom::Error has no source; this is adequate display
|
||||
panic!("could not retrieve random bytes for uuid: {}", err)
|
||||
});
|
||||
|
||||
((bytes[0] as u16) << 8) | (bytes[1] as u16)
|
||||
}
|
||||
|
||||
#[cfg(feature = "fast-rng")]
|
||||
{
|
||||
rand::random()
|
||||
}
|
||||
}
|
||||
14
third-party/vendor/uuid/src/sha1.rs
vendored
Normal file
14
third-party/vendor/uuid/src/sha1.rs
vendored
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
#[cfg(feature = "v5")]
|
||||
pub(crate) fn hash(ns: &[u8], src: &[u8]) -> [u8; 16] {
|
||||
use sha1_smol::Sha1;
|
||||
|
||||
let mut hasher = Sha1::new();
|
||||
|
||||
hasher.update(ns);
|
||||
hasher.update(src);
|
||||
|
||||
let mut bytes = [0; 16];
|
||||
bytes.copy_from_slice(&hasher.digest().bytes()[..16]);
|
||||
|
||||
bytes
|
||||
}
|
||||
468
third-party/vendor/uuid/src/timestamp.rs
vendored
Normal file
468
third-party/vendor/uuid/src/timestamp.rs
vendored
Normal file
|
|
@ -0,0 +1,468 @@
|
|||
//! Generating UUIDs from timestamps.
|
||||
//!
|
||||
//! Timestamps are used in a few UUID versions as a source of decentralized
|
||||
//! uniqueness (as in versions 1 and 6), and as a way to enable sorting (as
|
||||
//! in versions 6 and 7). Timestamps aren't encoded the same way by all UUID
|
||||
//! versions so this module provides a single [`Timestamp`] type that can
|
||||
//! convert between them.
|
||||
//!
|
||||
//! # Timestamp representations in UUIDs
|
||||
//!
|
||||
//! Versions 1 and 6 UUIDs use a bespoke timestamp that consists of the
|
||||
//! number of 100ns ticks since `1582-10-15 00:00:00`, along with
|
||||
//! a counter value to avoid duplicates.
|
||||
//!
|
||||
//! Version 7 UUIDs use a more standard timestamp that consists of the
|
||||
//! number of millisecond ticks since the Unix epoch (`1970-01-01 00:00:00`).
|
||||
//!
|
||||
//! # References
|
||||
//!
|
||||
//! * [Timestamp in RFC4122](https://www.rfc-editor.org/rfc/rfc4122#section-4.1.4)
|
||||
//! * [Timestamp in Draft RFC: New UUID Formats, Version 4](https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-04#section-6.1)
|
||||
|
||||
use crate::Uuid;
|
||||
|
||||
/// The number of 100 nanosecond ticks between the RFC4122 epoch
|
||||
/// (`1582-10-15 00:00:00`) and the Unix epoch (`1970-01-01 00:00:00`).
|
||||
pub const UUID_TICKS_BETWEEN_EPOCHS: u64 = 0x01B2_1DD2_1381_4000;
|
||||
|
||||
/// A timestamp that can be encoded into a UUID.
|
||||
///
|
||||
/// This type abstracts the specific encoding, so versions 1, 6, and 7
|
||||
/// UUIDs can both be supported through the same type, even
|
||||
/// though they have a different representation of a timestamp.
|
||||
///
|
||||
/// # References
|
||||
///
|
||||
/// * [Timestamp in RFC4122](https://www.rfc-editor.org/rfc/rfc4122#section-4.1.4)
|
||||
/// * [Timestamp in Draft RFC: New UUID Formats, Version 4](https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-04#section-6.1)
|
||||
/// * [Clock Sequence in RFC4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.5)
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub struct Timestamp {
|
||||
pub(crate) seconds: u64,
|
||||
pub(crate) nanos: u32,
|
||||
#[cfg(any(feature = "v1", feature = "v6"))]
|
||||
pub(crate) counter: u16,
|
||||
}
|
||||
|
||||
impl Timestamp {
|
||||
/// Get a timestamp representing the current system time.
|
||||
///
|
||||
/// This method defers to the standard library's `SystemTime` type.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// This method will panic if calculating the elapsed time since the Unix epoch fails.
|
||||
#[cfg(feature = "std")]
|
||||
pub fn now(context: impl ClockSequence<Output = u16>) -> Self {
|
||||
#[cfg(not(any(feature = "v1", feature = "v6")))]
|
||||
{
|
||||
let _ = context;
|
||||
}
|
||||
|
||||
let (seconds, nanos) = now();
|
||||
|
||||
Timestamp {
|
||||
seconds,
|
||||
nanos,
|
||||
#[cfg(any(feature = "v1", feature = "v6"))]
|
||||
counter: context.generate_sequence(seconds, nanos),
|
||||
}
|
||||
}
|
||||
|
||||
/// Construct a `Timestamp` from an RFC4122 timestamp and counter, as used
|
||||
/// in versions 1 and 6 UUIDs.
|
||||
///
|
||||
/// # Overflow
|
||||
///
|
||||
/// If conversion from RFC4122 ticks to the internal timestamp format would overflow
|
||||
/// it will wrap.
|
||||
pub const fn from_rfc4122(ticks: u64, counter: u16) -> Self {
|
||||
#[cfg(not(any(feature = "v1", feature = "v6")))]
|
||||
{
|
||||
let _ = counter;
|
||||
}
|
||||
|
||||
let (seconds, nanos) = Self::rfc4122_to_unix(ticks);
|
||||
|
||||
Timestamp {
|
||||
seconds,
|
||||
nanos,
|
||||
#[cfg(any(feature = "v1", feature = "v6"))]
|
||||
counter,
|
||||
}
|
||||
}
|
||||
|
||||
/// Construct a `Timestamp` from a Unix timestamp, as used in version 7 UUIDs.
|
||||
///
|
||||
/// # Overflow
|
||||
///
|
||||
/// If conversion from RFC4122 ticks to the internal timestamp format would overflow
|
||||
/// it will wrap.
|
||||
pub fn from_unix(context: impl ClockSequence<Output = u16>, seconds: u64, nanos: u32) -> Self {
|
||||
#[cfg(not(any(feature = "v1", feature = "v6")))]
|
||||
{
|
||||
let _ = context;
|
||||
|
||||
Timestamp { seconds, nanos }
|
||||
}
|
||||
#[cfg(any(feature = "v1", feature = "v6"))]
|
||||
{
|
||||
let counter = context.generate_sequence(seconds, nanos);
|
||||
|
||||
Timestamp {
|
||||
seconds,
|
||||
nanos,
|
||||
counter,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the value of the timestamp as an RFC4122 timestamp and counter,
|
||||
/// as used in versions 1 and 6 UUIDs.
|
||||
///
|
||||
/// # Overflow
|
||||
///
|
||||
/// If conversion from RFC4122 ticks to the internal timestamp format would overflow
|
||||
/// it will wrap.
|
||||
#[cfg(any(feature = "v1", feature = "v6"))]
|
||||
pub const fn to_rfc4122(&self) -> (u64, u16) {
|
||||
(
|
||||
Self::unix_to_rfc4122_ticks(self.seconds, self.nanos),
|
||||
self.counter,
|
||||
)
|
||||
}
|
||||
|
||||
/// Get the value of the timestamp as a Unix timestamp, as used in version 7 UUIDs.
|
||||
///
|
||||
/// # Overflow
|
||||
///
|
||||
/// If conversion from RFC4122 ticks to the internal timestamp format would overflow
|
||||
/// it will wrap.
|
||||
pub const fn to_unix(&self) -> (u64, u32) {
|
||||
(self.seconds, self.nanos)
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "v1", feature = "v6"))]
|
||||
const fn unix_to_rfc4122_ticks(seconds: u64, nanos: u32) -> u64 {
|
||||
UUID_TICKS_BETWEEN_EPOCHS
|
||||
.wrapping_add(seconds.wrapping_mul(10_000_000))
|
||||
.wrapping_add(nanos as u64 / 100)
|
||||
}
|
||||
|
||||
const fn rfc4122_to_unix(ticks: u64) -> (u64, u32) {
|
||||
(
|
||||
ticks.wrapping_sub(UUID_TICKS_BETWEEN_EPOCHS) / 10_000_000,
|
||||
(ticks.wrapping_sub(UUID_TICKS_BETWEEN_EPOCHS) % 10_000_000) as u32 * 100,
|
||||
)
|
||||
}
|
||||
|
||||
#[deprecated(note = "use `to_unix` instead; this method will be removed in a future release")]
|
||||
/// Get the number of fractional nanoseconds in the Unix timestamp.
|
||||
///
|
||||
/// This method is deprecated and probably doesn't do what you're expecting it to.
|
||||
/// It doesn't return the timestamp as nanoseconds since the Unix epoch, it returns
|
||||
/// the fractional seconds of the timestamp.
|
||||
pub const fn to_unix_nanos(&self) -> u32 {
|
||||
panic!("`Timestamp::to_unix_nanos` is deprecated and will be removed: use `Timestamp::to_unix` instead")
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) const fn encode_rfc4122_timestamp(ticks: u64, counter: u16, node_id: &[u8; 6]) -> Uuid {
|
||||
let time_low = (ticks & 0xFFFF_FFFF) as u32;
|
||||
let time_mid = ((ticks >> 32) & 0xFFFF) as u16;
|
||||
let time_high_and_version = (((ticks >> 48) & 0x0FFF) as u16) | (1 << 12);
|
||||
|
||||
let mut d4 = [0; 8];
|
||||
|
||||
d4[0] = (((counter & 0x3F00) >> 8) as u8) | 0x80;
|
||||
d4[1] = (counter & 0xFF) as u8;
|
||||
d4[2] = node_id[0];
|
||||
d4[3] = node_id[1];
|
||||
d4[4] = node_id[2];
|
||||
d4[5] = node_id[3];
|
||||
d4[6] = node_id[4];
|
||||
d4[7] = node_id[5];
|
||||
|
||||
Uuid::from_fields(time_low, time_mid, time_high_and_version, &d4)
|
||||
}
|
||||
|
||||
pub(crate) const fn decode_rfc4122_timestamp(uuid: &Uuid) -> (u64, u16) {
|
||||
let bytes = uuid.as_bytes();
|
||||
|
||||
let ticks: u64 = ((bytes[6] & 0x0F) as u64) << 56
|
||||
| (bytes[7] as u64) << 48
|
||||
| (bytes[4] as u64) << 40
|
||||
| (bytes[5] as u64) << 32
|
||||
| (bytes[0] as u64) << 24
|
||||
| (bytes[1] as u64) << 16
|
||||
| (bytes[2] as u64) << 8
|
||||
| (bytes[3] as u64);
|
||||
|
||||
let counter: u16 = ((bytes[8] & 0x3F) as u16) << 8 | (bytes[9] as u16);
|
||||
|
||||
(ticks, counter)
|
||||
}
|
||||
|
||||
pub(crate) const fn encode_sorted_rfc4122_timestamp(
|
||||
ticks: u64,
|
||||
counter: u16,
|
||||
node_id: &[u8; 6],
|
||||
) -> Uuid {
|
||||
let time_high = ((ticks >> 28) & 0xFFFF_FFFF) as u32;
|
||||
let time_mid = ((ticks >> 12) & 0xFFFF) as u16;
|
||||
let time_low_and_version = ((ticks & 0x0FFF) as u16) | (0x6 << 12);
|
||||
|
||||
let mut d4 = [0; 8];
|
||||
|
||||
d4[0] = (((counter & 0x3F00) >> 8) as u8) | 0x80;
|
||||
d4[1] = (counter & 0xFF) as u8;
|
||||
d4[2] = node_id[0];
|
||||
d4[3] = node_id[1];
|
||||
d4[4] = node_id[2];
|
||||
d4[5] = node_id[3];
|
||||
d4[6] = node_id[4];
|
||||
d4[7] = node_id[5];
|
||||
|
||||
Uuid::from_fields(time_high, time_mid, time_low_and_version, &d4)
|
||||
}
|
||||
|
||||
pub(crate) const fn decode_sorted_rfc4122_timestamp(uuid: &Uuid) -> (u64, u16) {
|
||||
let bytes = uuid.as_bytes();
|
||||
|
||||
let ticks: u64 = ((bytes[0]) as u64) << 52
|
||||
| (bytes[1] as u64) << 44
|
||||
| (bytes[2] as u64) << 36
|
||||
| (bytes[3] as u64) << 28
|
||||
| (bytes[4] as u64) << 20
|
||||
| (bytes[5] as u64) << 12
|
||||
| ((bytes[6] & 0xF) as u64) << 8
|
||||
| (bytes[7] as u64);
|
||||
|
||||
let counter: u16 = ((bytes[8] & 0x3F) as u16) << 8 | (bytes[9] as u16);
|
||||
|
||||
(ticks, counter)
|
||||
}
|
||||
|
||||
pub(crate) const fn encode_unix_timestamp_millis(millis: u64, random_bytes: &[u8; 10]) -> Uuid {
|
||||
let millis_high = ((millis >> 16) & 0xFFFF_FFFF) as u32;
|
||||
let millis_low = (millis & 0xFFFF) as u16;
|
||||
|
||||
let random_and_version =
|
||||
(random_bytes[1] as u16 | ((random_bytes[0] as u16) << 8) & 0x0FFF) | (0x7 << 12);
|
||||
|
||||
let mut d4 = [0; 8];
|
||||
|
||||
d4[0] = (random_bytes[2] & 0x3F) | 0x80;
|
||||
d4[1] = random_bytes[3];
|
||||
d4[2] = random_bytes[4];
|
||||
d4[3] = random_bytes[5];
|
||||
d4[4] = random_bytes[6];
|
||||
d4[5] = random_bytes[7];
|
||||
d4[6] = random_bytes[8];
|
||||
d4[7] = random_bytes[9];
|
||||
|
||||
Uuid::from_fields(millis_high, millis_low, random_and_version, &d4)
|
||||
}
|
||||
|
||||
pub(crate) const fn decode_unix_timestamp_millis(uuid: &Uuid) -> u64 {
|
||||
let bytes = uuid.as_bytes();
|
||||
|
||||
let millis: u64 = (bytes[0] as u64) << 40
|
||||
| (bytes[1] as u64) << 32
|
||||
| (bytes[2] as u64) << 24
|
||||
| (bytes[3] as u64) << 16
|
||||
| (bytes[4] as u64) << 8
|
||||
| (bytes[5] as u64);
|
||||
|
||||
millis
|
||||
}
|
||||
|
||||
#[cfg(all(
|
||||
feature = "std",
|
||||
feature = "js",
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
)
|
||||
))]
|
||||
fn now() -> (u64, u32) {
|
||||
use wasm_bindgen::prelude::*;
|
||||
|
||||
#[wasm_bindgen]
|
||||
extern "C" {
|
||||
// NOTE: This signature works around https://bugzilla.mozilla.org/show_bug.cgi?id=1787770
|
||||
#[wasm_bindgen(js_namespace = Date, catch)]
|
||||
fn now() -> Result<f64, JsValue>;
|
||||
}
|
||||
|
||||
let now = now().unwrap_throw();
|
||||
|
||||
let secs = (now / 1_000.0) as u64;
|
||||
let nanos = ((now % 1_000.0) * 1_000_000.0) as u32;
|
||||
|
||||
(secs, nanos)
|
||||
}
|
||||
|
||||
#[cfg(all(
|
||||
feature = "std",
|
||||
any(
|
||||
not(feature = "js"),
|
||||
not(all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
))
|
||||
)
|
||||
))]
|
||||
fn now() -> (u64, u32) {
|
||||
let dur = std::time::SystemTime::UNIX_EPOCH.elapsed().expect(
|
||||
"Getting elapsed time since UNIX_EPOCH. If this fails, we've somehow violated causality",
|
||||
);
|
||||
|
||||
(dur.as_secs(), dur.subsec_nanos())
|
||||
}
|
||||
|
||||
/// A counter that can be used by version 1 and version 6 UUIDs to support
|
||||
/// the uniqueness of timestamps.
|
||||
///
|
||||
/// # References
|
||||
///
|
||||
/// * [Clock Sequence in RFC4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.5)
|
||||
pub trait ClockSequence {
|
||||
/// The type of sequence returned by this counter.
|
||||
type Output;
|
||||
|
||||
/// Get the next value in the sequence to feed into a timestamp.
|
||||
///
|
||||
/// This method will be called each time a [`Timestamp`] is constructed.
|
||||
fn generate_sequence(&self, seconds: u64, subsec_nanos: u32) -> Self::Output;
|
||||
}
|
||||
|
||||
impl<'a, T: ClockSequence + ?Sized> ClockSequence for &'a T {
|
||||
type Output = T::Output;
|
||||
fn generate_sequence(&self, seconds: u64, subsec_nanos: u32) -> Self::Output {
|
||||
(**self).generate_sequence(seconds, subsec_nanos)
|
||||
}
|
||||
}
|
||||
|
||||
/// Default implementations for the [`ClockSequence`] trait.
|
||||
pub mod context {
|
||||
use super::ClockSequence;
|
||||
|
||||
#[cfg(any(feature = "v1", feature = "v6"))]
|
||||
use atomic::{Atomic, Ordering};
|
||||
|
||||
/// An empty counter that will always return the value `0`.
|
||||
///
|
||||
/// This type should be used when constructing timestamps for version 7 UUIDs,
|
||||
/// since they don't need a counter for uniqueness.
|
||||
#[derive(Debug, Clone, Copy, Default)]
|
||||
pub struct NoContext;
|
||||
|
||||
impl ClockSequence for NoContext {
|
||||
type Output = u16;
|
||||
|
||||
fn generate_sequence(&self, _seconds: u64, _nanos: u32) -> Self::Output {
|
||||
0
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(all(any(feature = "v1", feature = "v6"), feature = "std", feature = "rng"))]
|
||||
static CONTEXT: Context = Context {
|
||||
count: Atomic::new(0),
|
||||
};
|
||||
|
||||
#[cfg(all(any(feature = "v1", feature = "v6"), feature = "std", feature = "rng"))]
|
||||
static CONTEXT_INITIALIZED: Atomic<bool> = Atomic::new(false);
|
||||
|
||||
#[cfg(all(any(feature = "v1", feature = "v6"), feature = "std", feature = "rng"))]
|
||||
pub(crate) fn shared_context() -> &'static Context {
|
||||
// If the context is in its initial state then assign it to a random value
|
||||
// It doesn't matter if multiple threads observe `false` here and initialize the context
|
||||
if CONTEXT_INITIALIZED
|
||||
.compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed)
|
||||
.is_ok()
|
||||
{
|
||||
CONTEXT.count.store(crate::rng::u16(), Ordering::Release);
|
||||
}
|
||||
|
||||
&CONTEXT
|
||||
}
|
||||
|
||||
/// A thread-safe, wrapping counter that produces 14-bit numbers.
|
||||
///
|
||||
/// This type should be used when constructing version 1 and version 6 UUIDs.
|
||||
#[derive(Debug)]
|
||||
#[cfg(any(feature = "v1", feature = "v6"))]
|
||||
pub struct Context {
|
||||
count: Atomic<u16>,
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "v1", feature = "v6"))]
|
||||
impl Context {
|
||||
/// Construct a new context that's initialized with the given value.
|
||||
///
|
||||
/// The starting value should be a random number, so that UUIDs from
|
||||
/// different systems with the same timestamps are less likely to collide.
|
||||
/// When the `rng` feature is enabled, prefer the [`Context::new_random`] method.
|
||||
pub const fn new(count: u16) -> Self {
|
||||
Self {
|
||||
count: Atomic::<u16>::new(count),
|
||||
}
|
||||
}
|
||||
|
||||
/// Construct a new context that's initialized with a random value.
|
||||
#[cfg(feature = "rng")]
|
||||
pub fn new_random() -> Self {
|
||||
Self {
|
||||
count: Atomic::<u16>::new(crate::rng::u16()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "v1", feature = "v6"))]
|
||||
impl ClockSequence for Context {
|
||||
type Output = u16;
|
||||
|
||||
fn generate_sequence(&self, _seconds: u64, _nanos: u32) -> Self::Output {
|
||||
// RFC4122 reserves 2 bits of the clock sequence so the actual
|
||||
// maximum value is smaller than `u16::MAX`. Since we unconditionally
|
||||
// increment the clock sequence we want to wrap once it becomes larger
|
||||
// than what we can represent in a "u14". Otherwise there'd be patches
|
||||
// where the clock sequence doesn't change regardless of the timestamp
|
||||
self.count.fetch_add(1, Ordering::AcqRel) & (u16::MAX >> 2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(all(test, any(feature = "v1", feature = "v6")))]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[cfg(all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
))]
|
||||
use wasm_bindgen_test::*;
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn rfc4122_unix_does_not_panic() {
|
||||
// Ensure timestamp conversions never panic
|
||||
Timestamp::unix_to_rfc4122_ticks(u64::MAX, 0);
|
||||
Timestamp::unix_to_rfc4122_ticks(0, u32::MAX);
|
||||
Timestamp::unix_to_rfc4122_ticks(u64::MAX, u32::MAX);
|
||||
|
||||
Timestamp::rfc4122_to_unix(u64::MAX);
|
||||
}
|
||||
}
|
||||
200
third-party/vendor/uuid/src/v1.rs
vendored
Normal file
200
third-party/vendor/uuid/src/v1.rs
vendored
Normal file
|
|
@ -0,0 +1,200 @@
|
|||
//! The implementation for Version 1 UUIDs.
|
||||
//!
|
||||
//! This module is soft-deprecated. Instead of using the `Context` type re-exported here,
|
||||
//! use the one from the crate root.
|
||||
|
||||
use crate::{Builder, Uuid};
|
||||
|
||||
#[deprecated(note = "use types from the crate root instead")]
|
||||
pub use crate::{timestamp::context::Context, Timestamp};
|
||||
|
||||
impl Uuid {
|
||||
/// Create a new version 1 UUID using the current system time and node ID.
|
||||
///
|
||||
/// This method is only available if both the `std` and `rng` features are enabled.
|
||||
///
|
||||
/// This method is a convenient alternative to [`Uuid::new_v1`] that uses the current system time
|
||||
/// as the source timestamp.
|
||||
///
|
||||
/// Note that usage of this method requires the `v1`, `std`, and `rng` features of this crate
|
||||
/// to be enabled.
|
||||
#[cfg(all(feature = "std", feature = "rng"))]
|
||||
pub fn now_v1(node_id: &[u8; 6]) -> Self {
|
||||
let ts = Timestamp::now(crate::timestamp::context::shared_context());
|
||||
|
||||
Self::new_v1(ts, node_id)
|
||||
}
|
||||
|
||||
/// Create a new version 1 UUID using the given timestamp and node ID.
|
||||
///
|
||||
/// Also see [`Uuid::now_v1`] for a convenient way to generate version 1
|
||||
/// UUIDs using the current system time.
|
||||
///
|
||||
/// When generating [`Timestamp`]s using a [`ClockSequence`], this function
|
||||
/// is only guaranteed to produce unique values if the following conditions
|
||||
/// hold:
|
||||
///
|
||||
/// 1. The *node ID* is unique for this process,
|
||||
/// 2. The *context* is shared across all threads which are generating version 1
|
||||
/// UUIDs,
|
||||
/// 3. The [`ClockSequence`] implementation reliably returns unique
|
||||
/// clock sequences (this crate provides [`Context`] for this
|
||||
/// purpose. However you can create your own [`ClockSequence`]
|
||||
/// implementation, if [`Context`] does not meet your needs).
|
||||
///
|
||||
/// Note that usage of this method requires the `v1` feature of this crate
|
||||
/// to be enabled.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// A UUID can be created from a unix [`Timestamp`] with a
|
||||
/// [`ClockSequence`]. RFC4122 requires the clock sequence
|
||||
/// is seeded with a random value:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::{Timestamp, Context};
|
||||
/// # use uuid::Uuid;
|
||||
/// # fn random_seed() -> u16 { 42 }
|
||||
/// let context = Context::new(random_seed());
|
||||
/// let ts = Timestamp::from_unix(&context, 1497624119, 1234);
|
||||
///
|
||||
/// let uuid = Uuid::new_v1(ts, &[1, 2, 3, 4, 5, 6]);
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// "f3b4958c-52a1-11e7-802a-010203040506"
|
||||
/// );
|
||||
/// ```
|
||||
///
|
||||
/// The timestamp can also be created manually as per RFC4122:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::{Uuid, Timestamp, Context, ClockSequence};
|
||||
/// let context = Context::new(42);
|
||||
/// let ts = Timestamp::from_rfc4122(14976234442241191232, context.generate_sequence(0, 0));
|
||||
///
|
||||
/// let uuid = Uuid::new_v1(ts, &[1, 2, 3, 4, 5, 6]);
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// "b2c1ad40-45e0-1fd6-802a-010203040506"
|
||||
/// );
|
||||
/// ```
|
||||
///
|
||||
/// # References
|
||||
///
|
||||
/// * [Version 1 UUIDs in RFC4122](https://www.rfc-editor.org/rfc/rfc4122#section-4.2)
|
||||
///
|
||||
/// [`Timestamp`]: v1/struct.Timestamp.html
|
||||
/// [`ClockSequence`]: v1/trait.ClockSequence.html
|
||||
/// [`Context`]: v1/struct.Context.html
|
||||
pub fn new_v1(ts: Timestamp, node_id: &[u8; 6]) -> Self {
|
||||
let (ticks, counter) = ts.to_rfc4122();
|
||||
|
||||
Builder::from_rfc4122_timestamp(ticks, counter, node_id).into_uuid()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
use crate::{std::string::ToString, Variant, Version};
|
||||
#[cfg(all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
))]
|
||||
use wasm_bindgen_test::*;
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_new() {
|
||||
let time: u64 = 1_496_854_535;
|
||||
let time_fraction: u32 = 812_946_000;
|
||||
let node = [1, 2, 3, 4, 5, 6];
|
||||
let context = Context::new(0);
|
||||
|
||||
let uuid = Uuid::new_v1(Timestamp::from_unix(&context, time, time_fraction), &node);
|
||||
|
||||
assert_eq!(uuid.get_version(), Some(Version::Mac));
|
||||
assert_eq!(uuid.get_variant(), Variant::RFC4122);
|
||||
assert_eq!(
|
||||
uuid.hyphenated().to_string(),
|
||||
"20616934-4ba2-11e7-8000-010203040506"
|
||||
);
|
||||
|
||||
let ts = uuid.get_timestamp().unwrap().to_rfc4122();
|
||||
|
||||
assert_eq!(ts.0 - 0x01B2_1DD2_1381_4000, 14_968_545_358_129_460);
|
||||
|
||||
// Ensure parsing the same UUID produces the same timestamp
|
||||
let parsed = Uuid::parse_str("20616934-4ba2-11e7-8000-010203040506").unwrap();
|
||||
|
||||
assert_eq!(
|
||||
uuid.get_timestamp().unwrap(),
|
||||
parsed.get_timestamp().unwrap()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
#[cfg(all(feature = "std", feature = "rng"))]
|
||||
fn test_now() {
|
||||
let node = [1, 2, 3, 4, 5, 6];
|
||||
|
||||
let uuid = Uuid::now_v1(&node);
|
||||
|
||||
assert_eq!(uuid.get_version(), Some(Version::Mac));
|
||||
assert_eq!(uuid.get_variant(), Variant::RFC4122);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_new_context() {
|
||||
let time: u64 = 1_496_854_535;
|
||||
let time_fraction: u32 = 812_946_000;
|
||||
let node = [1, 2, 3, 4, 5, 6];
|
||||
|
||||
// This context will wrap
|
||||
let context = Context::new(u16::MAX >> 2);
|
||||
|
||||
let uuid1 = Uuid::new_v1(Timestamp::from_unix(&context, time, time_fraction), &node);
|
||||
|
||||
let time: u64 = 1_496_854_536;
|
||||
|
||||
let uuid2 = Uuid::new_v1(Timestamp::from_unix(&context, time, time_fraction), &node);
|
||||
|
||||
assert_eq!(uuid1.get_timestamp().unwrap().to_rfc4122().1, 16383);
|
||||
assert_eq!(uuid2.get_timestamp().unwrap().to_rfc4122().1, 0);
|
||||
|
||||
let time = 1_496_854_535;
|
||||
|
||||
let uuid3 = Uuid::new_v1(Timestamp::from_unix(&context, time, time_fraction), &node);
|
||||
let uuid4 = Uuid::new_v1(Timestamp::from_unix(&context, time, time_fraction), &node);
|
||||
|
||||
assert_eq!(uuid3.get_timestamp().unwrap().to_rfc4122().1, 1);
|
||||
assert_eq!(uuid4.get_timestamp().unwrap().to_rfc4122().1, 2);
|
||||
}
|
||||
}
|
||||
169
third-party/vendor/uuid/src/v3.rs
vendored
Normal file
169
third-party/vendor/uuid/src/v3.rs
vendored
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
use crate::Uuid;
|
||||
|
||||
impl Uuid {
|
||||
/// Creates a UUID using a name from a namespace, based on the MD5
|
||||
/// hash.
|
||||
///
|
||||
/// A number of namespaces are available as constants in this crate:
|
||||
///
|
||||
/// * [`NAMESPACE_DNS`]
|
||||
/// * [`NAMESPACE_OID`]
|
||||
/// * [`NAMESPACE_URL`]
|
||||
/// * [`NAMESPACE_X500`]
|
||||
///
|
||||
/// Note that usage of this method requires the `v3` feature of this crate
|
||||
/// to be enabled.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Generating a MD5 DNS UUID for `rust-lang.org`:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::{Uuid, Version};
|
||||
/// let uuid = Uuid::new_v3(&Uuid::NAMESPACE_DNS, b"rust-lang.org");
|
||||
///
|
||||
/// assert_eq!(Some(Version::Md5), uuid.get_version());
|
||||
/// ```
|
||||
///
|
||||
/// # References
|
||||
///
|
||||
/// * [Version 3 and 5 UUIDs in RFC4122](https://www.rfc-editor.org/rfc/rfc4122#section-4.3)
|
||||
///
|
||||
/// [`NAMESPACE_DNS`]: #associatedconstant.NAMESPACE_DNS
|
||||
/// [`NAMESPACE_OID`]: #associatedconstant.NAMESPACE_OID
|
||||
/// [`NAMESPACE_URL`]: #associatedconstant.NAMESPACE_URL
|
||||
/// [`NAMESPACE_X500`]: #associatedconstant.NAMESPACE_X500
|
||||
pub fn new_v3(namespace: &Uuid, name: &[u8]) -> Uuid {
|
||||
crate::Builder::from_md5_bytes(crate::md5::hash(namespace.as_bytes(), name)).into_uuid()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[cfg(all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
))]
|
||||
use wasm_bindgen_test::*;
|
||||
|
||||
use crate::{std::string::ToString, Variant, Version};
|
||||
|
||||
static FIXTURE: &'static [(&'static Uuid, &'static str, &'static str)] = &[
|
||||
(
|
||||
&Uuid::NAMESPACE_DNS,
|
||||
"example.org",
|
||||
"04738bdf-b25a-3829-a801-b21a1d25095b",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_DNS,
|
||||
"rust-lang.org",
|
||||
"c6db027c-615c-3b4d-959e-1a917747ca5a",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_DNS,
|
||||
"42",
|
||||
"5aab6e0c-b7d3-379c-92e3-2bfbb5572511",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_DNS,
|
||||
"lorem ipsum",
|
||||
"4f8772e9-b59c-3cc9-91a9-5c823df27281",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_URL,
|
||||
"example.org",
|
||||
"39682ca1-9168-3da2-a1bb-f4dbcde99bf9",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_URL,
|
||||
"rust-lang.org",
|
||||
"7ed45aaf-e75b-3130-8e33-ee4d9253b19f",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_URL,
|
||||
"42",
|
||||
"08998a0c-fcf4-34a9-b444-f2bfc15731dc",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_URL,
|
||||
"lorem ipsum",
|
||||
"e55ad2e6-fb89-34e8-b012-c5dde3cd67f0",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_OID,
|
||||
"example.org",
|
||||
"f14eec63-2812-3110-ad06-1625e5a4a5b2",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_OID,
|
||||
"rust-lang.org",
|
||||
"6506a0ec-4d79-3e18-8c2b-f2b6b34f2b6d",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_OID,
|
||||
"42",
|
||||
"ce6925a5-2cd7-327b-ab1c-4b375ac044e4",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_OID,
|
||||
"lorem ipsum",
|
||||
"5dd8654f-76ba-3d47-bc2e-4d6d3a78cb09",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_X500,
|
||||
"example.org",
|
||||
"64606f3f-bd63-363e-b946-fca13611b6f7",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_X500,
|
||||
"rust-lang.org",
|
||||
"bcee7a9c-52f1-30c6-a3cc-8c72ba634990",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_X500,
|
||||
"42",
|
||||
"c1073fa2-d4a6-3104-b21d-7a6bdcf39a23",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_X500,
|
||||
"lorem ipsum",
|
||||
"02f09a3f-1624-3b1d-8409-44eff7708208",
|
||||
),
|
||||
];
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_new() {
|
||||
for &(ref ns, ref name, _) in FIXTURE {
|
||||
let uuid = Uuid::new_v3(*ns, name.as_bytes());
|
||||
assert_eq!(uuid.get_version(), Some(Version::Md5));
|
||||
assert_eq!(uuid.get_variant(), Variant::RFC4122);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_hyphenated_string() {
|
||||
for &(ref ns, ref name, ref expected) in FIXTURE {
|
||||
let uuid = Uuid::new_v3(*ns, name.as_bytes());
|
||||
assert_eq!(uuid.hyphenated().to_string(), *expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
81
third-party/vendor/uuid/src/v4.rs
vendored
Normal file
81
third-party/vendor/uuid/src/v4.rs
vendored
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
use crate::Uuid;
|
||||
|
||||
impl Uuid {
|
||||
/// Creates a random UUID.
|
||||
///
|
||||
/// This uses the [`getrandom`] crate to utilise the operating system's RNG
|
||||
/// as the source of random numbers. If you'd like to use a custom
|
||||
/// generator, don't use this method: generate random bytes using your
|
||||
/// custom generator and pass them to the
|
||||
/// [`uuid::Builder::from_random_bytes`][from_random_bytes] function
|
||||
/// instead.
|
||||
///
|
||||
/// Note that usage of this method requires the `v4` feature of this crate
|
||||
/// to be enabled.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::{Uuid, Version};
|
||||
/// let uuid = Uuid::new_v4();
|
||||
///
|
||||
/// assert_eq!(Some(Version::Random), uuid.get_version());
|
||||
/// ```
|
||||
///
|
||||
/// # References
|
||||
///
|
||||
/// * [Version 4 UUIDs in RFC4122](https://www.rfc-editor.org/rfc/rfc4122#section-4.4)
|
||||
///
|
||||
/// [`getrandom`]: https://crates.io/crates/getrandom
|
||||
/// [from_random_bytes]: struct.Builder.html#method.from_random_bytes
|
||||
pub fn new_v4() -> Uuid {
|
||||
crate::Builder::from_random_bytes(crate::rng::bytes()).into_uuid()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::{Variant, Version};
|
||||
|
||||
#[cfg(all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
))]
|
||||
use wasm_bindgen_test::*;
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_new() {
|
||||
let uuid = Uuid::new_v4();
|
||||
|
||||
assert_eq!(uuid.get_version(), Some(Version::Random));
|
||||
assert_eq!(uuid.get_variant(), Variant::RFC4122);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_get_version() {
|
||||
let uuid = Uuid::new_v4();
|
||||
|
||||
assert_eq!(uuid.get_version(), Some(Version::Random));
|
||||
assert_eq!(uuid.get_version_num(), 4)
|
||||
}
|
||||
}
|
||||
187
third-party/vendor/uuid/src/v5.rs
vendored
Normal file
187
third-party/vendor/uuid/src/v5.rs
vendored
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
use crate::Uuid;
|
||||
|
||||
impl Uuid {
|
||||
/// Creates a UUID using a name from a namespace, based on the SHA-1 hash.
|
||||
///
|
||||
/// A number of namespaces are available as constants in this crate:
|
||||
///
|
||||
/// * [`NAMESPACE_DNS`]
|
||||
/// * [`NAMESPACE_OID`]
|
||||
/// * [`NAMESPACE_URL`]
|
||||
/// * [`NAMESPACE_X500`]
|
||||
///
|
||||
/// Note that usage of this method requires the `v5` feature of this crate
|
||||
/// to be enabled.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Generating a SHA1 DNS UUID for `rust-lang.org`:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::{Uuid, Version};
|
||||
/// let uuid = Uuid::new_v5(&Uuid::NAMESPACE_DNS, b"rust-lang.org");
|
||||
///
|
||||
/// assert_eq!(Some(Version::Sha1), uuid.get_version());
|
||||
/// ```
|
||||
///
|
||||
/// # References
|
||||
///
|
||||
/// * [Version 3 and 5 UUIDs in RFC4122](https://www.rfc-editor.org/rfc/rfc4122#section-4.3)
|
||||
///
|
||||
/// [`NAMESPACE_DNS`]: struct.Uuid.html#associatedconst.NAMESPACE_DNS
|
||||
/// [`NAMESPACE_OID`]: struct.Uuid.html#associatedconst.NAMESPACE_OID
|
||||
/// [`NAMESPACE_URL`]: struct.Uuid.html#associatedconst.NAMESPACE_URL
|
||||
/// [`NAMESPACE_X500`]: struct.Uuid.html#associatedconst.NAMESPACE_X500
|
||||
pub fn new_v5(namespace: &Uuid, name: &[u8]) -> Uuid {
|
||||
crate::Builder::from_sha1_bytes(crate::sha1::hash(namespace.as_bytes(), name)).into_uuid()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[cfg(all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
))]
|
||||
use wasm_bindgen_test::*;
|
||||
|
||||
use crate::{std::string::ToString, Variant, Version};
|
||||
|
||||
static FIXTURE: &'static [(&'static Uuid, &'static str, &'static str)] = &[
|
||||
(
|
||||
&Uuid::NAMESPACE_DNS,
|
||||
"example.org",
|
||||
"aad03681-8b63-5304-89e0-8ca8f49461b5",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_DNS,
|
||||
"rust-lang.org",
|
||||
"c66bbb60-d62e-5f17-a399-3a0bd237c503",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_DNS,
|
||||
"42",
|
||||
"7c411b5e-9d3f-50b5-9c28-62096e41c4ed",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_DNS,
|
||||
"lorem ipsum",
|
||||
"97886a05-8a68-5743-ad55-56ab2d61cf7b",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_URL,
|
||||
"example.org",
|
||||
"54a35416-963c-5dd6-a1e2-5ab7bb5bafc7",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_URL,
|
||||
"rust-lang.org",
|
||||
"c48d927f-4122-5413-968c-598b1780e749",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_URL,
|
||||
"42",
|
||||
"5c2b23de-4bad-58ee-a4b3-f22f3b9cfd7d",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_URL,
|
||||
"lorem ipsum",
|
||||
"15c67689-4b85-5253-86b4-49fbb138569f",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_OID,
|
||||
"example.org",
|
||||
"34784df9-b065-5094-92c7-00bb3da97a30",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_OID,
|
||||
"rust-lang.org",
|
||||
"8ef61ecb-977a-5844-ab0f-c25ef9b8d5d6",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_OID,
|
||||
"42",
|
||||
"ba293c61-ad33-57b9-9671-f3319f57d789",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_OID,
|
||||
"lorem ipsum",
|
||||
"6485290d-f79e-5380-9e64-cb4312c7b4a6",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_X500,
|
||||
"example.org",
|
||||
"e3635e86-f82b-5bbc-a54a-da97923e5c76",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_X500,
|
||||
"rust-lang.org",
|
||||
"26c9c3e9-49b7-56da-8b9f-a0fb916a71a3",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_X500,
|
||||
"42",
|
||||
"e4b88014-47c6-5fe0-a195-13710e5f6e27",
|
||||
),
|
||||
(
|
||||
&Uuid::NAMESPACE_X500,
|
||||
"lorem ipsum",
|
||||
"b11f79a5-1e6d-57ce-a4b5-ba8531ea03d0",
|
||||
),
|
||||
];
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_get_version() {
|
||||
let uuid = Uuid::new_v5(&Uuid::NAMESPACE_DNS, "rust-lang.org".as_bytes());
|
||||
|
||||
assert_eq!(uuid.get_version(), Some(Version::Sha1));
|
||||
assert_eq!(uuid.get_version_num(), 5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_hyphenated() {
|
||||
for &(ref ns, ref name, ref expected) in FIXTURE {
|
||||
let uuid = Uuid::new_v5(*ns, name.as_bytes());
|
||||
|
||||
assert_eq!(uuid.hyphenated().to_string(), *expected)
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_new() {
|
||||
for &(ref ns, ref name, ref u) in FIXTURE {
|
||||
let uuid = Uuid::new_v5(*ns, name.as_bytes());
|
||||
|
||||
assert_eq!(uuid.get_version(), Some(Version::Sha1));
|
||||
assert_eq!(uuid.get_variant(), Variant::RFC4122);
|
||||
assert_eq!(Ok(uuid), u.parse());
|
||||
}
|
||||
}
|
||||
}
|
||||
202
third-party/vendor/uuid/src/v6.rs
vendored
Normal file
202
third-party/vendor/uuid/src/v6.rs
vendored
Normal file
|
|
@ -0,0 +1,202 @@
|
|||
//! The implementation for Version 6 UUIDs.
|
||||
//!
|
||||
//! Note that you need to enable the `v6` Cargo feature
|
||||
//! in order to use this module.
|
||||
|
||||
use crate::{Builder, Timestamp, Uuid};
|
||||
|
||||
impl Uuid {
|
||||
/// Create a new version 6 UUID using the current system time and node ID.
|
||||
///
|
||||
/// This method is only available if the `std` feature is enabled.
|
||||
///
|
||||
/// This method is a convenient alternative to [`Uuid::new_v6`] that uses the current system time
|
||||
/// as the source timestamp.
|
||||
///
|
||||
/// Note that usage of this method requires the `v6`, `std`, and `rng` features of this crate
|
||||
/// to be enabled.
|
||||
#[cfg(all(feature = "std", feature = "rng"))]
|
||||
pub fn now_v6(node_id: &[u8; 6]) -> Self {
|
||||
let ts = Timestamp::now(crate::timestamp::context::shared_context());
|
||||
|
||||
Self::new_v6(ts, node_id)
|
||||
}
|
||||
|
||||
/// Create a new version 6 UUID using the given timestamp and a node ID.
|
||||
///
|
||||
/// This is similar to version 1 UUIDs, except that it is lexicographically sortable by timestamp.
|
||||
///
|
||||
/// Also see [`Uuid::now_v6`] for a convenient way to generate version 6
|
||||
/// UUIDs using the current system time.
|
||||
///
|
||||
/// When generating [`Timestamp`]s using a [`ClockSequence`], this function
|
||||
/// is only guaranteed to produce unique values if the following conditions
|
||||
/// hold:
|
||||
///
|
||||
/// 1. The *node ID* is unique for this process,
|
||||
/// 2. The *context* is shared across all threads which are generating version 6
|
||||
/// UUIDs,
|
||||
/// 3. The [`ClockSequence`] implementation reliably returns unique
|
||||
/// clock sequences (this crate provides [`Context`] for this
|
||||
/// purpose. However you can create your own [`ClockSequence`]
|
||||
/// implementation, if [`Context`] does not meet your needs).
|
||||
///
|
||||
/// The NodeID must be exactly 6 bytes long.
|
||||
///
|
||||
/// Note that usage of this method requires the `v6` feature of this crate
|
||||
/// to be enabled.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// A UUID can be created from a unix [`Timestamp`] with a
|
||||
/// [`ClockSequence`]. RFC4122 requires the clock sequence
|
||||
/// is seeded with a random value:
|
||||
///
|
||||
/// ```rust
|
||||
/// # use uuid::{Uuid, Timestamp, Context};
|
||||
/// # fn random_seed() -> u16 { 42 }
|
||||
/// let context = Context::new(random_seed());
|
||||
/// let ts = Timestamp::from_unix(context, 1497624119, 1234);
|
||||
///
|
||||
/// let uuid = Uuid::new_v6(ts, &[1, 2, 3, 4, 5, 6]);
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// "1e752a1f-3b49-658c-802a-010203040506"
|
||||
/// );
|
||||
/// ```
|
||||
///
|
||||
/// The timestamp can also be created manually as per RFC4122:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::{Uuid, Timestamp, Context, ClockSequence};
|
||||
/// # fn random_seed() -> u16 { 42 }
|
||||
/// let context = Context::new(random_seed());
|
||||
/// let ts = Timestamp::from_rfc4122(14976241191231231313, context.generate_sequence(0, 0) );
|
||||
///
|
||||
/// let uuid = Uuid::new_v6(ts, &[1, 2, 3, 4, 5, 6]);
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// uuid.hyphenated().to_string(),
|
||||
/// "fd64c041-1e91-6551-802a-010203040506"
|
||||
/// );
|
||||
/// ```
|
||||
///
|
||||
/// # References
|
||||
///
|
||||
/// * [Version 6 UUIDs in Draft RFC: New UUID Formats, Version 4](https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-04#section-5.1)
|
||||
///
|
||||
/// [`Timestamp`]: timestamp/struct.Timestamp.html
|
||||
/// [`ClockSequence`]: timestamp/trait.ClockSequence.html
|
||||
/// [`Context`]: timestamp/context/struct.Context.html
|
||||
pub fn new_v6(ts: Timestamp, node_id: &[u8; 6]) -> Self {
|
||||
let (ticks, counter) = ts.to_rfc4122();
|
||||
|
||||
Builder::from_sorted_rfc4122_timestamp(ticks, counter, node_id).into_uuid()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::{Context, Variant, Version};
|
||||
use std::string::ToString;
|
||||
|
||||
#[cfg(all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
))]
|
||||
use wasm_bindgen_test::*;
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_new() {
|
||||
let time: u64 = 1_496_854_535;
|
||||
let time_fraction: u32 = 812_946_000;
|
||||
let node = [1, 2, 3, 4, 5, 6];
|
||||
let context = Context::new(0);
|
||||
|
||||
let uuid = Uuid::new_v6(Timestamp::from_unix(context, time, time_fraction), &node);
|
||||
|
||||
assert_eq!(uuid.get_version(), Some(Version::SortMac));
|
||||
assert_eq!(uuid.get_variant(), Variant::RFC4122);
|
||||
assert_eq!(
|
||||
uuid.hyphenated().to_string(),
|
||||
"1e74ba22-0616-6934-8000-010203040506"
|
||||
);
|
||||
|
||||
let ts = uuid.get_timestamp().unwrap().to_rfc4122();
|
||||
|
||||
assert_eq!(ts.0 - 0x01B2_1DD2_1381_4000, 14_968_545_358_129_460);
|
||||
|
||||
// Ensure parsing the same UUID produces the same timestamp
|
||||
let parsed = Uuid::parse_str("1e74ba22-0616-6934-8000-010203040506").unwrap();
|
||||
|
||||
assert_eq!(
|
||||
uuid.get_timestamp().unwrap(),
|
||||
parsed.get_timestamp().unwrap()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
#[cfg(all(feature = "std", feature = "rng"))]
|
||||
fn test_now() {
|
||||
let node = [1, 2, 3, 4, 5, 6];
|
||||
|
||||
let uuid = Uuid::now_v6(&node);
|
||||
|
||||
assert_eq!(uuid.get_version(), Some(Version::SortMac));
|
||||
assert_eq!(uuid.get_variant(), Variant::RFC4122);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_new_context() {
|
||||
let time: u64 = 1_496_854_535;
|
||||
let time_fraction: u32 = 812_946_000;
|
||||
let node = [1, 2, 3, 4, 5, 6];
|
||||
|
||||
// This context will wrap
|
||||
let context = Context::new(u16::MAX >> 2);
|
||||
|
||||
let uuid1 = Uuid::new_v6(Timestamp::from_unix(&context, time, time_fraction), &node);
|
||||
|
||||
let time: u64 = 1_496_854_536;
|
||||
|
||||
let uuid2 = Uuid::new_v6(Timestamp::from_unix(&context, time, time_fraction), &node);
|
||||
|
||||
assert_eq!(uuid1.get_timestamp().unwrap().to_rfc4122().1, 16383);
|
||||
assert_eq!(uuid2.get_timestamp().unwrap().to_rfc4122().1, 0);
|
||||
|
||||
let time = 1_496_854_535;
|
||||
|
||||
let uuid3 = Uuid::new_v6(Timestamp::from_unix(&context, time, time_fraction), &node);
|
||||
let uuid4 = Uuid::new_v6(Timestamp::from_unix(&context, time, time_fraction), &node);
|
||||
|
||||
assert_eq!(uuid3.get_timestamp().unwrap().counter, 1);
|
||||
assert_eq!(uuid4.get_timestamp().unwrap().counter, 2);
|
||||
}
|
||||
}
|
||||
156
third-party/vendor/uuid/src/v7.rs
vendored
Normal file
156
third-party/vendor/uuid/src/v7.rs
vendored
Normal file
|
|
@ -0,0 +1,156 @@
|
|||
//! The implementation for Version 7 UUIDs.
|
||||
//!
|
||||
//! Note that you need to enable the `v7` Cargo feature
|
||||
//! in order to use this module.
|
||||
|
||||
use crate::{rng, std::convert::TryInto, timestamp::Timestamp, Builder, Uuid};
|
||||
|
||||
impl Uuid {
|
||||
/// Create a new version 7 UUID using the current time value and random bytes.
|
||||
///
|
||||
/// This method is a convenient alternative to [`Uuid::new_v7`] that uses the current system time
|
||||
/// as the source timestamp.
|
||||
#[cfg(feature = "std")]
|
||||
pub fn now_v7() -> Self {
|
||||
Self::new_v7(Timestamp::now(crate::NoContext))
|
||||
}
|
||||
|
||||
/// Create a new version 7 UUID using a time value and random bytes.
|
||||
///
|
||||
/// When the `std` feature is enabled, you can also use [`Uuid::now_v7`].
|
||||
///
|
||||
/// Note that usage of this method requires the `v7` feature of this crate
|
||||
/// to be enabled.
|
||||
///
|
||||
/// Also see [`Uuid::now_v7`] for a convenient way to generate version 7
|
||||
/// UUIDs using the current system time.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// A v7 UUID can be created from a unix [`Timestamp`] plus a 128 bit
|
||||
/// random number. When supplied as such, the data will be
|
||||
///
|
||||
/// ```rust
|
||||
/// # use uuid::{Uuid, Timestamp, NoContext};
|
||||
/// let ts = Timestamp::from_unix(NoContext, 1497624119, 1234);
|
||||
///
|
||||
/// let uuid = Uuid::new_v7(ts);
|
||||
///
|
||||
/// assert!(
|
||||
/// uuid.hyphenated().to_string().starts_with("015cb15a-86d8-7")
|
||||
/// );
|
||||
/// ```
|
||||
///
|
||||
/// # References
|
||||
///
|
||||
/// * [Version 7 UUIDs in Draft RFC: New UUID Formats, Version 4](https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-04#section-5.2)
|
||||
pub fn new_v7(ts: Timestamp) -> Self {
|
||||
let (secs, nanos) = ts.to_unix();
|
||||
let millis = (secs * 1000).saturating_add(nanos as u64 / 1_000_000);
|
||||
|
||||
Builder::from_unix_timestamp_millis(millis, &rng::bytes()[..10].try_into().unwrap())
|
||||
.into_uuid()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::{std::string::ToString, NoContext, Variant, Version};
|
||||
#[cfg(all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
))]
|
||||
use wasm_bindgen_test::*;
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_new() {
|
||||
let ts: u64 = 1645557742000;
|
||||
|
||||
let seconds = ts / 1000;
|
||||
let nanos = ((ts % 1000) * 1_000_000) as u32;
|
||||
|
||||
let uuid = Uuid::new_v7(Timestamp::from_unix(NoContext, seconds, nanos));
|
||||
let uustr = uuid.hyphenated().to_string();
|
||||
|
||||
assert_eq!(uuid.get_version(), Some(Version::SortRand));
|
||||
assert_eq!(uuid.get_variant(), Variant::RFC4122);
|
||||
assert!(uuid.hyphenated().to_string().starts_with("017f22e2-79b0-7"));
|
||||
|
||||
// Ensure parsing the same UUID produces the same timestamp
|
||||
let parsed = Uuid::parse_str(uustr.as_str()).unwrap();
|
||||
|
||||
assert_eq!(uuid, parsed);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
#[cfg(feature = "std")]
|
||||
fn test_now() {
|
||||
let uuid = Uuid::now_v7();
|
||||
|
||||
assert_eq!(uuid.get_version(), Some(Version::SortRand));
|
||||
assert_eq!(uuid.get_variant(), Variant::RFC4122);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_sorting() {
|
||||
let time1: u64 = 1_496_854_535;
|
||||
let time_fraction1: u32 = 812_000_000;
|
||||
|
||||
let time2 = time1 + 4000;
|
||||
let time_fraction2 = time_fraction1;
|
||||
|
||||
let uuid1 = Uuid::new_v7(Timestamp::from_unix(NoContext, time1, time_fraction1));
|
||||
let uuid2 = Uuid::new_v7(Timestamp::from_unix(NoContext, time2, time_fraction2));
|
||||
|
||||
assert!(uuid1.as_bytes() < uuid2.as_bytes());
|
||||
assert!(uuid1.to_string() < uuid2.to_string());
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_new_timestamp_roundtrip() {
|
||||
let time: u64 = 1_496_854_535;
|
||||
let time_fraction: u32 = 812_000_000;
|
||||
|
||||
let ts = Timestamp::from_unix(NoContext, time, time_fraction);
|
||||
|
||||
let uuid = Uuid::new_v7(ts);
|
||||
|
||||
let decoded_ts = uuid.get_timestamp().unwrap();
|
||||
|
||||
assert_eq!(ts.to_unix(), decoded_ts.to_unix());
|
||||
}
|
||||
}
|
||||
68
third-party/vendor/uuid/src/v8.rs
vendored
Normal file
68
third-party/vendor/uuid/src/v8.rs
vendored
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
use crate::{Builder, Uuid};
|
||||
|
||||
impl Uuid {
|
||||
/// Creates a custom UUID comprised almost entirely of user-supplied bytes.
|
||||
///
|
||||
/// This will inject the UUID Version at 4 bits starting at the 48th bit
|
||||
/// and the Variant into 2 bits 64th bit. Any existing bits in the user-supplied bytes
|
||||
/// at those locations will be overridden.
|
||||
///
|
||||
/// Note that usage of this method requires the `v8` feature of this crate
|
||||
/// to be enabled.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// # use uuid::{Uuid, Version};
|
||||
/// let buf: [u8; 16] = *b"abcdefghijklmnop";
|
||||
/// let uuid = Uuid::new_v8(buf);
|
||||
///
|
||||
/// assert_eq!(Some(Version::Custom), uuid.get_version());
|
||||
/// ```
|
||||
///
|
||||
/// # References
|
||||
///
|
||||
/// * [Version 8 UUIDs in Draft RFC: New UUID Formats, Version 4](https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-04#section-5.3)
|
||||
pub fn new_v8(buf: [u8; 16]) -> Uuid {
|
||||
Builder::from_custom_bytes(buf).into_uuid()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::{Variant, Version};
|
||||
use std::string::ToString;
|
||||
|
||||
#[cfg(all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
))]
|
||||
use wasm_bindgen_test::*;
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(
|
||||
all(
|
||||
target_arch = "wasm32",
|
||||
target_vendor = "unknown",
|
||||
target_os = "unknown"
|
||||
),
|
||||
wasm_bindgen_test
|
||||
)]
|
||||
fn test_new() {
|
||||
let buf: [u8; 16] = [
|
||||
0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0,
|
||||
];
|
||||
let uuid = Uuid::new_v8(buf);
|
||||
assert_eq!(uuid.get_version(), Some(Version::Custom));
|
||||
assert_eq!(uuid.get_variant(), Variant::RFC4122);
|
||||
assert_eq!(uuid.get_version_num(), 8);
|
||||
assert_eq!(
|
||||
uuid.hyphenated().to_string(),
|
||||
"0f0e0d0c-0b0a-8908-8706-050403020100"
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue