uuid/
builder.rs

1// Copyright 2013-2014 The Rust Project Developers.
2// Copyright 2018 The Uuid Project Developers.
3//
4// See the COPYRIGHT file at the top-level directory of this distribution.
5//
6// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
7// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
8// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
9// option. This file may not be copied, modified, or distributed
10// except according to those terms.
11
12//! A Builder type for [`Uuid`]s.
13//!
14//! [`Uuid`]: ../struct.Uuid.html
15
16use crate::{error::*, timestamp, Bytes, Uuid, Variant, Version};
17
18/// A builder for creating a UUID.
19///
20/// This type is useful if you need to mutate individual fields of a [`Uuid`]
21/// while constructing it. Since the [`Uuid`] type is `Copy`, it doesn't offer
22/// any methods to mutate in place. They live on the `Builder` instead.
23///
24/// The `Builder` type also always exposes APIs to construct [`Uuid`]s for any
25/// version without needing crate features or additional dependencies. It's a
26/// lower-level API than the methods on [`Uuid`].
27///
28/// # Examples
29///
30/// Creating a version 4 UUID from externally generated random bytes:
31///
32/// ```
33/// # use uuid::{Builder, Version, Variant};
34/// # let rng = || [
35/// #     70, 235, 208, 238, 14, 109, 67, 201, 185, 13, 204, 195, 90,
36/// # 145, 63, 62,
37/// # ];
38/// let random_bytes = rng();
39///
40/// let uuid = Builder::from_random_bytes(random_bytes).into_uuid();
41///
42/// assert_eq!(Some(Version::Random), uuid.get_version());
43/// assert_eq!(Variant::RFC4122, uuid.get_variant());
44/// ```
45#[allow(missing_copy_implementations)]
46#[derive(Debug)]
47pub struct Builder(Uuid);
48
49impl Uuid {
50    /// The 'nil UUID' (all zeros).
51    ///
52    /// The nil UUID is a special form of UUID that is specified to have all
53    /// 128 bits set to zero.
54    ///
55    /// # References
56    ///
57    /// * [Nil UUID in RFC 9562](https://www.ietf.org/rfc/rfc9562.html#section-5.9)
58    ///
59    /// # Examples
60    ///
61    /// Basic usage:
62    ///
63    /// ```
64    /// # use uuid::Uuid;
65    /// let uuid = Uuid::nil();
66    ///
67    /// assert_eq!(
68    ///     "00000000-0000-0000-0000-000000000000",
69    ///     uuid.hyphenated().to_string(),
70    /// );
71    /// ```
72    pub const fn nil() -> Self {
73        Uuid::from_bytes([0; 16])
74    }
75
76    /// The 'max UUID' (all ones).
77    ///
78    /// The max UUID is a special form of UUID that is specified to have all
79    /// 128 bits set to one.
80    ///
81    /// # References
82    ///
83    /// * [Max UUID in RFC 9562](https://www.ietf.org/rfc/rfc9562.html#section-5.10)
84    ///
85    /// # Examples
86    ///
87    /// Basic usage:
88    ///
89    /// ```
90    /// # use uuid::Uuid;
91    /// let uuid = Uuid::max();
92    ///
93    /// assert_eq!(
94    ///     "ffffffff-ffff-ffff-ffff-ffffffffffff",
95    ///     uuid.hyphenated().to_string(),
96    /// );
97    /// ```
98    pub const fn max() -> Self {
99        Uuid::from_bytes([0xFF; 16])
100    }
101
102    /// Creates a UUID from four field values.
103    ///
104    /// # Examples
105    ///
106    /// Basic usage:
107    ///
108    /// ```
109    /// # use uuid::Uuid;
110    /// let d1 = 0xa1a2a3a4;
111    /// let d2 = 0xb1b2;
112    /// let d3 = 0xc1c2;
113    /// let d4 = [0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8];
114    ///
115    /// let uuid = Uuid::from_fields(d1, d2, d3, &d4);
116    ///
117    /// assert_eq!(
118    ///     "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
119    ///     uuid.hyphenated().to_string(),
120    /// );
121    /// ```
122    pub const fn from_fields(d1: u32, d2: u16, d3: u16, d4: &[u8; 8]) -> Uuid {
123        Uuid::from_bytes([
124            (d1 >> 24) as u8,
125            (d1 >> 16) as u8,
126            (d1 >> 8) as u8,
127            d1 as u8,
128            (d2 >> 8) as u8,
129            d2 as u8,
130            (d3 >> 8) as u8,
131            d3 as u8,
132            d4[0],
133            d4[1],
134            d4[2],
135            d4[3],
136            d4[4],
137            d4[5],
138            d4[6],
139            d4[7],
140        ])
141    }
142
143    /// Creates a UUID from four field values in little-endian order.
144    ///
145    /// The bytes in the `d1`, `d2` and `d3` fields will be flipped to convert
146    /// into big-endian order. This is based on the endianness of the UUID,
147    /// rather than the target environment so bytes will be flipped on both
148    /// big and little endian machines.
149    ///
150    /// # Examples
151    ///
152    /// Basic usage:
153    ///
154    /// ```
155    /// # use uuid::Uuid;
156    /// let d1 = 0xa1a2a3a4;
157    /// let d2 = 0xb1b2;
158    /// let d3 = 0xc1c2;
159    /// let d4 = [0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8];
160    ///
161    /// let uuid = Uuid::from_fields_le(d1, d2, d3, &d4);
162    ///
163    /// assert_eq!(
164    ///     "a4a3a2a1-b2b1-c2c1-d1d2-d3d4d5d6d7d8",
165    ///     uuid.hyphenated().to_string(),
166    /// );
167    /// ```
168    pub const fn from_fields_le(d1: u32, d2: u16, d3: u16, d4: &[u8; 8]) -> Uuid {
169        Uuid::from_bytes([
170            d1 as u8,
171            (d1 >> 8) as u8,
172            (d1 >> 16) as u8,
173            (d1 >> 24) as u8,
174            (d2) as u8,
175            (d2 >> 8) as u8,
176            d3 as u8,
177            (d3 >> 8) as u8,
178            d4[0],
179            d4[1],
180            d4[2],
181            d4[3],
182            d4[4],
183            d4[5],
184            d4[6],
185            d4[7],
186        ])
187    }
188
189    /// Creates a UUID from a 128bit value.
190    ///
191    /// # Examples
192    ///
193    /// Basic usage:
194    ///
195    /// ```
196    /// # use uuid::Uuid;
197    /// let v = 0xa1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8u128;
198    ///
199    /// let uuid = Uuid::from_u128(v);
200    ///
201    /// assert_eq!(
202    ///     "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
203    ///     uuid.hyphenated().to_string(),
204    /// );
205    /// ```
206    pub const fn from_u128(v: u128) -> Self {
207        Uuid::from_bytes([
208            (v >> 120) as u8,
209            (v >> 112) as u8,
210            (v >> 104) as u8,
211            (v >> 96) as u8,
212            (v >> 88) as u8,
213            (v >> 80) as u8,
214            (v >> 72) as u8,
215            (v >> 64) as u8,
216            (v >> 56) as u8,
217            (v >> 48) as u8,
218            (v >> 40) as u8,
219            (v >> 32) as u8,
220            (v >> 24) as u8,
221            (v >> 16) as u8,
222            (v >> 8) as u8,
223            v as u8,
224        ])
225    }
226
227    /// Creates a UUID from a 128bit value in little-endian order.
228    ///
229    /// The entire value will be flipped to convert into big-endian order.
230    /// This is based on the endianness of the UUID, rather than the target
231    /// environment so bytes will be flipped on both big and little endian
232    /// machines.
233    ///
234    /// # Examples
235    ///
236    /// Basic usage:
237    ///
238    /// ```
239    /// # use uuid::Uuid;
240    /// let v = 0xa1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8u128;
241    ///
242    /// let uuid = Uuid::from_u128_le(v);
243    ///
244    /// assert_eq!(
245    ///     "d8d7d6d5-d4d3-d2d1-c2c1-b2b1a4a3a2a1",
246    ///     uuid.hyphenated().to_string(),
247    /// );
248    /// ```
249    pub const fn from_u128_le(v: u128) -> Self {
250        Uuid::from_bytes([
251            v as u8,
252            (v >> 8) as u8,
253            (v >> 16) as u8,
254            (v >> 24) as u8,
255            (v >> 32) as u8,
256            (v >> 40) as u8,
257            (v >> 48) as u8,
258            (v >> 56) as u8,
259            (v >> 64) as u8,
260            (v >> 72) as u8,
261            (v >> 80) as u8,
262            (v >> 88) as u8,
263            (v >> 96) as u8,
264            (v >> 104) as u8,
265            (v >> 112) as u8,
266            (v >> 120) as u8,
267        ])
268    }
269
270    /// Creates a UUID from two 64bit values.
271    ///
272    /// # Examples
273    ///
274    /// Basic usage:
275    ///
276    /// ```
277    /// # use uuid::Uuid;
278    /// let hi = 0xa1a2a3a4b1b2c1c2u64;
279    /// let lo = 0xd1d2d3d4d5d6d7d8u64;
280    ///
281    /// let uuid = Uuid::from_u64_pair(hi, lo);
282    ///
283    /// assert_eq!(
284    ///     "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
285    ///     uuid.hyphenated().to_string(),
286    /// );
287    /// ```
288    pub const fn from_u64_pair(high_bits: u64, low_bits: u64) -> Self {
289        Uuid::from_bytes([
290            (high_bits >> 56) as u8,
291            (high_bits >> 48) as u8,
292            (high_bits >> 40) as u8,
293            (high_bits >> 32) as u8,
294            (high_bits >> 24) as u8,
295            (high_bits >> 16) as u8,
296            (high_bits >> 8) as u8,
297            high_bits as u8,
298            (low_bits >> 56) as u8,
299            (low_bits >> 48) as u8,
300            (low_bits >> 40) as u8,
301            (low_bits >> 32) as u8,
302            (low_bits >> 24) as u8,
303            (low_bits >> 16) as u8,
304            (low_bits >> 8) as u8,
305            low_bits as u8,
306        ])
307    }
308
309    /// Creates a UUID using the supplied bytes.
310    ///
311    /// # Errors
312    ///
313    /// This function will return an error if `b` has any length other than 16.
314    ///
315    /// # Examples
316    ///
317    /// Basic usage:
318    ///
319    /// ```
320    /// # fn main() -> Result<(), uuid::Error> {
321    /// # use uuid::Uuid;
322    /// let bytes = [
323    ///     0xa1, 0xa2, 0xa3, 0xa4,
324    ///     0xb1, 0xb2,
325    ///     0xc1, 0xc2,
326    ///     0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
327    /// ];
328    ///
329    /// let uuid = Uuid::from_slice(&bytes)?;
330    ///
331    /// assert_eq!(
332    ///     "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
333    ///     uuid.hyphenated().to_string(),
334    /// );
335    /// # Ok(())
336    /// # }
337    /// ```
338    pub fn from_slice(b: &[u8]) -> Result<Uuid, Error> {
339        if b.len() != 16 {
340            return Err(Error(ErrorKind::ByteLength { len: b.len() }));
341        }
342
343        let mut bytes: Bytes = [0; 16];
344        bytes.copy_from_slice(b);
345        Ok(Uuid::from_bytes(bytes))
346    }
347
348    /// Creates a UUID using the supplied bytes in little endian order.
349    ///
350    /// The individual fields encoded in the buffer will be flipped.
351    ///
352    /// # Errors
353    ///
354    /// This function will return an error if `b` has any length other than 16.
355    ///
356    /// # Examples
357    ///
358    /// Basic usage:
359    ///
360    /// ```
361    /// # fn main() -> Result<(), uuid::Error> {
362    /// # use uuid::Uuid;
363    /// let bytes = [
364    ///     0xa1, 0xa2, 0xa3, 0xa4,
365    ///     0xb1, 0xb2,
366    ///     0xc1, 0xc2,
367    ///     0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
368    /// ];
369    ///
370    /// let uuid = Uuid::from_slice_le(&bytes)?;
371    ///
372    /// assert_eq!(
373    ///     uuid.hyphenated().to_string(),
374    ///     "a4a3a2a1-b2b1-c2c1-d1d2-d3d4d5d6d7d8"
375    /// );
376    /// # Ok(())
377    /// # }
378    /// ```
379    pub fn from_slice_le(b: &[u8]) -> Result<Uuid, Error> {
380        if b.len() != 16 {
381            return Err(Error(ErrorKind::ByteLength { len: b.len() }));
382        }
383
384        let mut bytes: Bytes = [0; 16];
385        bytes.copy_from_slice(b);
386        Ok(Uuid::from_bytes_le(bytes))
387    }
388
389    /// Creates a UUID using the supplied bytes.
390    ///
391    /// # Examples
392    ///
393    /// Basic usage:
394    ///
395    /// ```
396    /// # fn main() -> Result<(), uuid::Error> {
397    /// # use uuid::Uuid;
398    /// let bytes = [
399    ///     0xa1, 0xa2, 0xa3, 0xa4,
400    ///     0xb1, 0xb2,
401    ///     0xc1, 0xc2,
402    ///     0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
403    /// ];
404    ///
405    /// let uuid = Uuid::from_bytes(bytes);
406    ///
407    /// assert_eq!(
408    ///     uuid.hyphenated().to_string(),
409    ///     "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8"
410    /// );
411    /// # Ok(())
412    /// # }
413    /// ```
414    #[inline]
415    pub const fn from_bytes(bytes: Bytes) -> Uuid {
416        Uuid(bytes)
417    }
418
419    /// Creates a UUID using the supplied bytes in little endian order.
420    ///
421    /// The individual fields encoded in the buffer will be flipped.
422    ///
423    /// # Examples
424    ///
425    /// Basic usage:
426    ///
427    /// ```
428    /// # fn main() -> Result<(), uuid::Error> {
429    /// # use uuid::Uuid;
430    /// let bytes = [
431    ///     0xa1, 0xa2, 0xa3, 0xa4,
432    ///     0xb1, 0xb2,
433    ///     0xc1, 0xc2,
434    ///     0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
435    /// ];
436    ///
437    /// let uuid = Uuid::from_bytes_le(bytes);
438    ///
439    /// assert_eq!(
440    ///     "a4a3a2a1-b2b1-c2c1-d1d2-d3d4d5d6d7d8",
441    ///     uuid.hyphenated().to_string(),
442    /// );
443    /// # Ok(())
444    /// # }
445    /// ```
446    pub const fn from_bytes_le(b: Bytes) -> Uuid {
447        Uuid([
448            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],
449            b[14], b[15],
450        ])
451    }
452
453    /// Creates a reference to a UUID from a reference to the supplied bytes.
454    ///
455    /// # Examples
456    ///
457    /// Basic usage:
458    ///
459    /// ```
460    /// # fn main() -> Result<(), uuid::Error> {
461    /// # use uuid::Uuid;
462    /// let bytes = [
463    ///     0xa1, 0xa2, 0xa3, 0xa4,
464    ///     0xb1, 0xb2,
465    ///     0xc1, 0xc2,
466    ///     0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
467    /// ];
468    ///
469    /// let uuid = Uuid::from_bytes_ref(&bytes);
470    ///
471    /// assert_eq!(
472    ///     uuid.hyphenated().to_string(),
473    ///     "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8"
474    /// );
475    ///
476    /// assert!(std::ptr::eq(
477    ///     uuid as *const Uuid as *const u8,
478    ///     &bytes as *const [u8; 16] as *const u8,
479    /// ));
480    /// # Ok(())
481    /// # }
482    /// ```
483    #[inline]
484    pub fn from_bytes_ref(bytes: &Bytes) -> &Uuid {
485        // SAFETY: `Bytes` and `Uuid` have the same ABI
486        unsafe { &*(bytes as *const Bytes as *const Uuid) }
487    }
488
489    // NOTE: There is no `from_u128_ref` because in little-endian
490    // environments the value isn't properly encoded. Callers would
491    // need to use `.to_be()` themselves.
492}
493
494impl Builder {
495    /// Creates a `Builder` using the supplied bytes.
496    ///
497    /// # Examples
498    ///
499    /// Basic usage:
500    ///
501    /// ```
502    /// # use uuid::Builder;
503    /// let bytes = [
504    ///     0xa1, 0xa2, 0xa3, 0xa4,
505    ///     0xb1, 0xb2,
506    ///     0xc1, 0xc2,
507    ///     0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
508    /// ];
509    ///
510    /// let uuid = Builder::from_bytes(bytes).into_uuid();
511    ///
512    /// assert_eq!(
513    ///     "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
514    ///     uuid.hyphenated().to_string(),
515    /// );
516    /// ```
517    pub const fn from_bytes(b: Bytes) -> Self {
518        Builder(Uuid::from_bytes(b))
519    }
520
521    /// Creates a `Builder` using the supplied bytes in little endian order.
522    ///
523    /// The individual fields encoded in the buffer will be flipped.
524    ///
525    /// # Examples
526    ///
527    /// Basic usage:
528    ///
529    /// ```
530    /// # fn main() -> Result<(), uuid::Error> {
531    /// # use uuid::{Builder, Uuid};
532    /// let bytes = [
533    ///     0xa1, 0xa2, 0xa3, 0xa4,
534    ///     0xb1, 0xb2,
535    ///     0xc1, 0xc2,
536    ///     0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
537    /// ];
538    ///
539    /// let uuid = Builder::from_bytes_le(bytes).into_uuid();
540    ///
541    /// assert_eq!(
542    ///     "a4a3a2a1-b2b1-c2c1-d1d2-d3d4d5d6d7d8",
543    ///     uuid.hyphenated().to_string(),
544    /// );
545    /// # Ok(())
546    /// # }
547    /// ```
548    pub const fn from_bytes_le(b: Bytes) -> Self {
549        Builder(Uuid::from_bytes_le(b))
550    }
551
552    /// Creates a `Builder` for a version 1 UUID using the supplied timestamp, counter, and node ID.
553    pub const fn from_gregorian_timestamp(ticks: u64, counter: u16, node_id: &[u8; 6]) -> Self {
554        Builder(timestamp::encode_gregorian_timestamp(
555            ticks, counter, node_id,
556        ))
557    }
558
559    /// Creates a `Builder` for a version 3 UUID using the supplied MD5 hashed bytes.
560    pub const fn from_md5_bytes(md5_bytes: Bytes) -> Self {
561        Builder(Uuid::from_bytes(md5_bytes))
562            .with_variant(Variant::RFC4122)
563            .with_version(Version::Md5)
564    }
565
566    /// Creates a `Builder` for a version 4 UUID using the supplied random bytes.
567    ///
568    /// This method assumes the bytes are already sufficiently random, it will only
569    /// set the appropriate bits for the UUID version and variant.
570    ///
571    /// # Examples
572    ///
573    /// ```
574    /// # use uuid::{Builder, Variant, Version};
575    /// # let rng = || [
576    /// #     70, 235, 208, 238, 14, 109, 67, 201, 185, 13, 204, 195, 90,
577    /// # 145, 63, 62,
578    /// # ];
579    /// let random_bytes = rng();
580    /// let uuid = Builder::from_random_bytes(random_bytes).into_uuid();
581    ///
582    /// assert_eq!(Some(Version::Random), uuid.get_version());
583    /// assert_eq!(Variant::RFC4122, uuid.get_variant());
584    /// ```
585    pub const fn from_random_bytes(random_bytes: Bytes) -> Self {
586        Builder(Uuid::from_bytes(random_bytes))
587            .with_variant(Variant::RFC4122)
588            .with_version(Version::Random)
589    }
590
591    /// Creates a `Builder` for a version 5 UUID using the supplied SHA-1 hashed bytes.
592    ///
593    /// This method assumes the bytes are already a SHA-1 hash, it will only set the appropriate
594    /// bits for the UUID version and variant.
595    pub const fn from_sha1_bytes(sha1_bytes: Bytes) -> Self {
596        Builder(Uuid::from_bytes(sha1_bytes))
597            .with_variant(Variant::RFC4122)
598            .with_version(Version::Sha1)
599    }
600
601    /// Creates a `Builder` for a version 6 UUID using the supplied timestamp, counter, and node ID.
602    ///
603    /// This method will encode the ticks, counter, and node ID in a sortable UUID.
604    pub const fn from_sorted_gregorian_timestamp(
605        ticks: u64,
606        counter: u16,
607        node_id: &[u8; 6],
608    ) -> Self {
609        Builder(timestamp::encode_sorted_gregorian_timestamp(
610            ticks, counter, node_id,
611        ))
612    }
613
614    /// Creates a `Builder` for a version 7 UUID using the supplied Unix timestamp and counter bytes.
615    ///
616    /// This method will set the variant field within the counter bytes without attempting to shift
617    /// the data around it. Callers using the counter as a monotonic value should be careful not to
618    /// store significant data in the 2 least significant bits of the 3rd byte.
619    ///
620    /// # Examples
621    ///
622    /// Creating a UUID using the current system timestamp:
623    ///
624    /// ```
625    /// # use std::convert::TryInto;
626    /// use std::time::{Duration, SystemTime};
627    /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
628    /// # use uuid::{Builder, Uuid, Variant, Version, Timestamp, NoContext};
629    /// # let rng = || [
630    /// #     70, 235, 208, 238, 14, 109, 67, 201, 185, 13
631    /// # ];
632    /// let ts = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH)?;
633    ///
634    /// let random_bytes = rng();
635    ///
636    /// let uuid = Builder::from_unix_timestamp_millis(ts.as_millis().try_into()?, &random_bytes).into_uuid();
637    ///
638    /// assert_eq!(Some(Version::SortRand), uuid.get_version());
639    /// assert_eq!(Variant::RFC4122, uuid.get_variant());
640    /// # Ok(())
641    /// # }
642    /// ```
643    pub const fn from_unix_timestamp_millis(millis: u64, counter_random_bytes: &[u8; 10]) -> Self {
644        Builder(timestamp::encode_unix_timestamp_millis(
645            millis,
646            counter_random_bytes,
647        ))
648    }
649
650    /// Creates a `Builder` for a version 8 UUID using the supplied user-defined bytes.
651    ///
652    /// This method won't interpret the given bytes in any way, except to set the appropriate
653    /// bits for the UUID version and variant.
654    pub const fn from_custom_bytes(custom_bytes: Bytes) -> Self {
655        Builder::from_bytes(custom_bytes)
656            .with_variant(Variant::RFC4122)
657            .with_version(Version::Custom)
658    }
659
660    /// Creates a `Builder` using the supplied bytes.
661    ///
662    /// # Errors
663    ///
664    /// This function will return an error if `b` has any length other than 16.
665    ///
666    /// # Examples
667    ///
668    /// Basic usage:
669    ///
670    /// ```
671    /// # use uuid::Builder;
672    /// # fn main() -> Result<(), uuid::Error> {
673    /// let bytes = [
674    ///     0xa1, 0xa2, 0xa3, 0xa4,
675    ///     0xb1, 0xb2,
676    ///     0xc1, 0xc2,
677    ///     0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
678    /// ];
679    ///
680    /// let uuid = Builder::from_slice(&bytes)?.into_uuid();
681    ///
682    /// assert_eq!(
683    ///     "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
684    ///     uuid.hyphenated().to_string(),
685    /// );
686    /// # Ok(())
687    /// # }
688    /// ```
689    pub fn from_slice(b: &[u8]) -> Result<Self, Error> {
690        Ok(Builder(Uuid::from_slice(b)?))
691    }
692
693    /// Creates a `Builder` using the supplied bytes in little endian order.
694    ///
695    /// The individual fields encoded in the buffer will be flipped.
696    ///
697    /// # Errors
698    ///
699    /// This function will return an error if `b` has any length other than 16.
700    ///
701    /// # Examples
702    ///
703    /// Basic usage:
704    ///
705    /// ```
706    /// # use uuid::Builder;
707    /// # fn main() -> Result<(), uuid::Error> {
708    /// let bytes = [
709    ///     0xa1, 0xa2, 0xa3, 0xa4,
710    ///     0xb1, 0xb2,
711    ///     0xc1, 0xc2,
712    ///     0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
713    /// ];
714    ///
715    /// let uuid = Builder::from_slice_le(&bytes)?.into_uuid();
716    ///
717    /// assert_eq!(
718    ///     "a4a3a2a1-b2b1-c2c1-d1d2-d3d4d5d6d7d8",
719    ///     uuid.hyphenated().to_string(),
720    /// );
721    /// # Ok(())
722    /// # }
723    /// ```
724    pub fn from_slice_le(b: &[u8]) -> Result<Self, Error> {
725        Ok(Builder(Uuid::from_slice_le(b)?))
726    }
727
728    /// Creates a `Builder` from four field values.
729    ///
730    /// # Examples
731    ///
732    /// Basic usage:
733    ///
734    /// ```
735    /// # use uuid::Builder;
736    /// let d1 = 0xa1a2a3a4;
737    /// let d2 = 0xb1b2;
738    /// let d3 = 0xc1c2;
739    /// let d4 = [0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8];
740    ///
741    /// let uuid = Builder::from_fields(d1, d2, d3, &d4).into_uuid();
742    ///
743    /// assert_eq!(
744    ///     uuid.hyphenated().to_string(),
745    ///     "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8"
746    /// );
747    /// ```
748    pub const fn from_fields(d1: u32, d2: u16, d3: u16, d4: &[u8; 8]) -> Self {
749        Builder(Uuid::from_fields(d1, d2, d3, d4))
750    }
751
752    /// Creates a `Builder` from four field values.
753    ///
754    /// # Examples
755    ///
756    /// Basic usage:
757    ///
758    /// ```
759    /// # use uuid::Builder;
760    /// let d1 = 0xa1a2a3a4;
761    /// let d2 = 0xb1b2;
762    /// let d3 = 0xc1c2;
763    /// let d4 = [0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8];
764    ///
765    /// let uuid = Builder::from_fields_le(d1, d2, d3, &d4).into_uuid();
766    ///
767    /// assert_eq!(
768    ///     uuid.hyphenated().to_string(),
769    ///     "a4a3a2a1-b2b1-c2c1-d1d2-d3d4d5d6d7d8"
770    /// );
771    /// ```
772    pub const fn from_fields_le(d1: u32, d2: u16, d3: u16, d4: &[u8; 8]) -> Self {
773        Builder(Uuid::from_fields_le(d1, d2, d3, d4))
774    }
775
776    /// Creates a `Builder` from a 128bit value.
777    ///
778    /// # Examples
779    ///
780    /// Basic usage:
781    ///
782    /// ```
783    /// # use uuid::Builder;
784    /// let v = 0xa1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8u128;
785    ///
786    /// let uuid = Builder::from_u128(v).into_uuid();
787    ///
788    /// assert_eq!(
789    ///     "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
790    ///     uuid.hyphenated().to_string(),
791    /// );
792    /// ```
793    pub const fn from_u128(v: u128) -> Self {
794        Builder(Uuid::from_u128(v))
795    }
796
797    /// Creates a UUID from a 128bit value in little-endian order.
798    ///
799    /// # Examples
800    ///
801    /// Basic usage:
802    ///
803    /// ```
804    /// # use uuid::Builder;
805    /// let v = 0xa1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8u128;
806    ///
807    /// let uuid = Builder::from_u128_le(v).into_uuid();
808    ///
809    /// assert_eq!(
810    ///     "d8d7d6d5-d4d3-d2d1-c2c1-b2b1a4a3a2a1",
811    ///     uuid.hyphenated().to_string(),
812    /// );
813    /// ```
814    pub const fn from_u128_le(v: u128) -> Self {
815        Builder(Uuid::from_u128_le(v))
816    }
817
818    /// Creates a `Builder` with an initial [`Uuid::nil`].
819    ///
820    /// # Examples
821    ///
822    /// Basic usage:
823    ///
824    /// ```
825    /// # use uuid::Builder;
826    /// let uuid = Builder::nil().into_uuid();
827    ///
828    /// assert_eq!(
829    ///     "00000000-0000-0000-0000-000000000000",
830    ///     uuid.hyphenated().to_string(),
831    /// );
832    /// ```
833    pub const fn nil() -> Self {
834        Builder(Uuid::nil())
835    }
836
837    /// Specifies the variant of the UUID.
838    pub fn set_variant(&mut self, v: Variant) -> &mut Self {
839        *self = Builder(self.0).with_variant(v);
840        self
841    }
842
843    /// Specifies the variant of the UUID.
844    pub const fn with_variant(mut self, v: Variant) -> Self {
845        let byte = (self.0).0[8];
846
847        (self.0).0[8] = match v {
848            Variant::NCS => byte & 0x7f,
849            Variant::RFC4122 => (byte & 0x3f) | 0x80,
850            Variant::Microsoft => (byte & 0x1f) | 0xc0,
851            Variant::Future => byte | 0xe0,
852        };
853
854        self
855    }
856
857    /// Specifies the version number of the UUID.
858    pub fn set_version(&mut self, v: Version) -> &mut Self {
859        *self = Builder(self.0).with_version(v);
860        self
861    }
862
863    /// Specifies the version number of the UUID.
864    pub const fn with_version(mut self, v: Version) -> Self {
865        (self.0).0[6] = ((self.0).0[6] & 0x0f) | ((v as u8) << 4);
866
867        self
868    }
869
870    /// Get a reference to the underlying [`Uuid`].
871    ///
872    /// # Examples
873    ///
874    /// Basic usage:
875    ///
876    /// ```
877    /// # use uuid::Builder;
878    /// let builder = Builder::nil();
879    ///
880    /// let uuid1 = builder.as_uuid();
881    /// let uuid2 = builder.as_uuid();
882    ///
883    /// assert_eq!(uuid1, uuid2);
884    /// ```
885    pub const fn as_uuid(&self) -> &Uuid {
886        &self.0
887    }
888
889    /// Convert the builder into a [`Uuid`].
890    ///
891    /// # Examples
892    ///
893    /// Basic usage:
894    ///
895    /// ```
896    /// # use uuid::Builder;
897    /// let uuid = Builder::nil().into_uuid();
898    ///
899    /// assert_eq!(
900    ///     uuid.hyphenated().to_string(),
901    ///     "00000000-0000-0000-0000-000000000000"
902    /// );
903    /// ```
904    pub const fn into_uuid(self) -> Uuid {
905        self.0
906    }
907}
908
909#[doc(hidden)]
910impl Builder {
911    #[deprecated(
912        since = "1.11.0",
913        note = "use `Builder::from_gregorian_timestamp(ticks, counter, node_id)`"
914    )]
915    pub const fn from_rfc4122_timestamp(ticks: u64, counter: u16, node_id: &[u8; 6]) -> Self {
916        Builder::from_gregorian_timestamp(ticks, counter, node_id)
917    }
918
919    #[deprecated(
920        since = "1.11.0",
921        note = "use `Builder::from_sorted_gregorian_timestamp(ticks, counter, node_id)`"
922    )]
923    pub const fn from_sorted_rfc4122_timestamp(
924        ticks: u64,
925        counter: u16,
926        node_id: &[u8; 6],
927    ) -> Self {
928        Builder::from_sorted_gregorian_timestamp(ticks, counter, node_id)
929    }
930}