1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
use crate::SHA1_SIZE;
use bstr::ByteSlice;
use std::convert::{TryFrom, TryInto};
use std::fmt;
#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]
#[cfg_attr(feature = "serde1", derive(serde::Serialize))]
pub struct Id<'a>(&'a [u8; SHA1_SIZE]);
impl<'a> Id<'a> {
pub fn kind(&self) -> crate::HashKind {
crate::HashKind::Sha1
}
pub fn first_byte(&self) -> u8 {
self.0[0]
}
}
impl<'a> Id<'a> {
pub fn to_sha1_hex(&self) -> [u8; SHA1_SIZE * 2] {
let mut buf = [0u8; SHA1_SIZE * 2];
hex::encode_to_slice(self.0, &mut buf).expect("to count correctly");
buf
}
pub fn sha1(&self) -> &[u8; SHA1_SIZE] {
self.0
}
pub fn null_sha1() -> Self {
Id(&[0u8; SHA1_SIZE])
}
}
impl<'a> From<&'a [u8; SHA1_SIZE]> for Id<'a> {
fn from(v: &'a [u8; SHA1_SIZE]) -> Self {
Id(v)
}
}
impl<'a> TryFrom<&'a [u8]> for Id<'a> {
type Error = std::array::TryFromSliceError;
fn try_from(value: &'a [u8]) -> Result<Self, Self::Error> {
Ok(Id(value.try_into()?))
}
}
impl fmt::Display for Id<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", &self.to_sha1_hex().as_bstr())
}
}
#[cfg(feature = "serde1")]
impl<'de: 'a, 'a> serde::Deserialize<'de> for Id<'a> {
fn deserialize<D>(deserializer: D) -> Result<Self, <D as serde::Deserializer<'de>>::Error>
where
D: serde::Deserializer<'de>,
{
struct __Visitor<'de: 'a, 'a> {
marker: serde::export::PhantomData<Id<'a>>,
lifetime: serde::export::PhantomData<&'de ()>,
}
impl<'de: 'a, 'a> serde::de::Visitor<'de> for __Visitor<'de, 'a> {
type Value = Id<'a>;
fn expecting(&self, __formatter: &mut serde::export::Formatter<'_>) -> serde::export::fmt::Result {
serde::export::Formatter::write_str(__formatter, "tuple struct Id")
}
#[inline]
fn visit_newtype_struct<__E>(self, __e: __E) -> serde::export::Result<Self::Value, __E::Error>
where
__E: serde::Deserializer<'de>,
{
let __field0: &'a [u8] = match <&'a [u8] as serde::Deserialize>::deserialize(__e) {
serde::export::Ok(__val) => __val,
serde::export::Err(__err) => {
return serde::export::Err(__err);
}
};
serde::export::Ok(Id(__field0.try_into().expect("exactly 20 bytes")))
}
#[inline]
fn visit_seq<__A>(self, mut __seq: __A) -> serde::export::Result<Self::Value, __A::Error>
where
__A: serde::de::SeqAccess<'de>,
{
let __field0 = match match serde::de::SeqAccess::next_element::<&'a [u8]>(&mut __seq) {
serde::export::Ok(__val) => __val,
serde::export::Err(__err) => {
return serde::export::Err(__err);
}
} {
serde::export::Some(__value) => __value,
serde::export::None => {
return serde::export::Err(serde::de::Error::invalid_length(
0usize,
&"tuple struct Id with 1 element",
));
}
};
serde::export::Ok(Id(__field0.try_into().expect("exactly 20 bytes")))
}
}
serde::Deserializer::deserialize_newtype_struct(
deserializer,
"Id",
__Visitor {
marker: serde::export::PhantomData::<Id<'a>>,
lifetime: serde::export::PhantomData,
},
)
}
}