Show More
@@ -8,8 +8,9 b'' | |||||
8 | //! In Mercurial code base, it is customary to call "a node" the binary SHA |
|
8 | //! In Mercurial code base, it is customary to call "a node" the binary SHA | |
9 | //! of a revision. |
|
9 | //! of a revision. | |
10 |
|
10 | |||
|
11 | use bytes_cast::BytesCast; | |||
11 | use hex::{self, FromHex, FromHexError}; |
|
12 | use hex::{self, FromHex, FromHexError}; | |
12 |
use std::convert:: |
|
13 | use std::convert::TryFrom; | |
13 |
|
14 | |||
14 | /// The length in bytes of a `Node` |
|
15 | /// The length in bytes of a `Node` | |
15 | /// |
|
16 | /// | |
@@ -49,7 +50,7 b' type NodeData = [u8; NODE_BYTES_LENGTH];' | |||||
49 | /// |
|
50 | /// | |
50 | /// [`nybbles_len`]: #method.nybbles_len |
|
51 | /// [`nybbles_len`]: #method.nybbles_len | |
51 | /// [`ExactLengthRequired`]: struct.NodeError#variant.ExactLengthRequired |
|
52 | /// [`ExactLengthRequired`]: struct.NodeError#variant.ExactLengthRequired | |
52 | #[derive(Clone, Debug, PartialEq)] |
|
53 | #[derive(Clone, Debug, PartialEq, BytesCast)] | |
53 | #[repr(transparent)] |
|
54 | #[repr(transparent)] | |
54 | pub struct Node { |
|
55 | pub struct Node { | |
55 | data: NodeData, |
|
56 | data: NodeData, | |
@@ -68,14 +69,14 b' impl From<NodeData> for Node {' | |||||
68 |
|
69 | |||
69 | /// Return an error if the slice has an unexpected length |
|
70 | /// Return an error if the slice has an unexpected length | |
70 | impl<'a> TryFrom<&'a [u8]> for &'a Node { |
|
71 | impl<'a> TryFrom<&'a [u8]> for &'a Node { | |
71 | type Error = std::array::TryFromSliceError; |
|
72 | type Error = (); | |
72 |
|
73 | |||
73 | #[inline] |
|
74 | #[inline] | |
74 | fn try_from(bytes: &'a [u8]) -> Result<&'a Node, Self::Error> { |
|
75 | fn try_from(bytes: &'a [u8]) -> Result<&'a Node, Self::Error> { | |
75 | let data = bytes.try_into()?; |
|
76 | match Node::from_bytes(bytes) { | |
76 | // Safety: `#[repr(transparent)]` makes it ok to "wrap" the target |
|
77 | Ok((node, rest)) if rest.is_empty() => Ok(node), | |
77 | // of a reference to the type of the single field. |
|
78 | _ => Err(()), | |
78 | Ok(unsafe { std::mem::transmute::<&NodeData, &Node>(data) }) |
|
79 | } | |
79 | } |
|
80 | } | |
80 | } |
|
81 | } | |
81 |
|
82 |
General Comments 0
You need to be logged in to leave comments.
Login now