1use std::{convert::TryFrom, str::FromStr};
2
3use crate::{oid, Kind, ObjectId};
4
5impl Default for Kind {
6 fn default() -> Self {
7 Kind::Sha1
8 }
9}
10
11impl TryFrom<u8> for Kind {
12 type Error = u8;
13
14 fn try_from(value: u8) -> Result<Self, Self::Error> {
15 Ok(match value {
16 1 => Kind::Sha1,
17 unknown => return Err(unknown),
18 })
19 }
20}
21
22impl FromStr for Kind {
23 type Err = String;
24
25 fn from_str(s: &str) -> Result<Self, Self::Err> {
26 Ok(match s {
27 "sha1" | "SHA1" => Kind::Sha1,
28 other => return Err(other.into()),
29 })
30 }
31}
32
33impl std::fmt::Display for Kind {
34 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35 match self {
36 Kind::Sha1 => f.write_str("SHA1"),
37 }
38 }
39}
40
41impl Kind {
42 #[inline]
44 pub const fn shortest() -> Self {
45 Self::Sha1
46 }
47
48 #[inline]
50 pub const fn longest() -> Self {
51 Self::Sha1
52 }
53
54 #[inline]
56 pub const fn hex_buf() -> [u8; Kind::longest().len_in_hex()] {
57 [0u8; Kind::longest().len_in_hex()]
58 }
59
60 #[inline]
62 pub const fn buf() -> [u8; Kind::longest().len_in_bytes()] {
63 [0u8; Kind::longest().len_in_bytes()]
64 }
65
66 #[inline]
68 pub const fn len_in_hex(&self) -> usize {
69 match self {
70 Kind::Sha1 => 40,
71 }
72 }
73 #[inline]
75 pub const fn len_in_bytes(&self) -> usize {
76 match self {
77 Kind::Sha1 => 20,
78 }
79 }
80
81 #[inline]
84 pub const fn from_hex_len(hex_len: usize) -> Option<Self> {
85 Some(match hex_len {
86 0..=40 => Kind::Sha1,
87 _ => return None,
88 })
89 }
90
91 #[inline]
100 pub(crate) fn from_len_in_bytes(bytes: usize) -> Self {
101 match bytes {
102 20 => Kind::Sha1,
103 _ => panic!("BUG: must be called only with valid hash lengths produced by len_in_bytes()"),
104 }
105 }
106
107 #[inline]
109 pub fn null_ref(&self) -> &'static oid {
110 match self {
111 Kind::Sha1 => oid::null_sha1(),
112 }
113 }
114
115 #[inline]
117 pub const fn null(&self) -> ObjectId {
118 match self {
119 Kind::Sha1 => ObjectId::null_sha1(),
120 }
121 }
122}