raw
1use std::fmt;
2
3use serde::de::Error as _;
4
5pub(crate) struct Commit(pub String);
6
7impl fmt::Display for Commit {
8 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
9 self.0.fmt(f)
10 }
11}
12
13impl<'de> serde::Deserialize<'de> for Commit {
14 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
15 where
16 D: serde::Deserializer<'de>,
17 {
18 let value = String::deserialize(deserializer)?;
19
20 if value.is_empty() {
21 return Err(D::Error::custom("invalid commit ref"));
22 }
23
24 for c in value.bytes() {
25 if !c.is_ascii_hexdigit() {
26 return Err(D::Error::custom("invalid commit ref"));
27 }
28 }
29
30 Ok(Self(value))
31 }
32}
33
34pub(crate) struct Obj(pub String);
35
36impl fmt::Display for Obj {
37 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
38 self.0.fmt(f)
39 }
40}
41
42impl<'de> serde::Deserialize<'de> for Obj {
43 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
44 where
45 D: serde::Deserializer<'de>,
46 {
47 let value = String::deserialize(deserializer)?;
48
49 if value.is_empty() {
50 return Err(D::Error::custom("invalid object ref"));
51 }
52
53 Ok(Self(value))
54 }
55}
56
57pub(crate) struct ObjectName(pub String);
58
59impl fmt::Display for ObjectName {
60 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
61 self.0.fmt(f)
62 }
63}
64
65impl<'de> serde::Deserialize<'de> for ObjectName {
66 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
67 where
68 D: serde::Deserializer<'de>,
69 {
70 let value = String::deserialize(deserializer)?;
71
72 if value.is_empty() {
73 return Err(D::Error::custom("invalid object name"));
74 }
75
76 Ok(Self(value))
77 }
78}
79
80pub(crate) struct Ref(pub String);
81
82impl fmt::Display for Ref {
83 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
84 self.0.fmt(f)
85 }
86}
87
88impl<'de> serde::Deserialize<'de> for Ref {
89 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
90 where
91 D: serde::Deserializer<'de>,
92 {
93 let value = String::deserialize(deserializer)?;
94
95 if value.is_empty() {
96 return Err(D::Error::custom("invalid ref"));
97 }
98
99 Ok(Self(value))
100 }
101}
102
103pub(crate) struct RepoName(pub String);
104
105impl fmt::Display for RepoName {
106 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
107 self.0.fmt(f)
108 }
109}
110
111impl<'de> serde::Deserialize<'de> for RepoName {
112 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
113 where
114 D: serde::Deserializer<'de>,
115 {
116 let value = String::deserialize(deserializer)?;
117
118 if value.is_empty() {
119 return Err(D::Error::custom("invalid repo name"));
120 }
121
122 Ok(Self(value))
123 }
124}
125
126pub(crate) struct Tag(pub String);
127
128impl fmt::Display for Tag {
129 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
130 self.0.fmt(f)
131 }
132}
133
134impl<'de> serde::Deserialize<'de> for Tag {
135 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
136 where
137 D: serde::Deserializer<'de>,
138 {
139 let value = String::deserialize(deserializer)?;
140
141 if value.is_empty() {
142 return Err(D::Error::custom("invalid tag"));
143 }
144
145 Ok(Self(value))
146 }
147}
148