wayver's git archive


a simple self-hosted git server
git clone https://git.wayver.dev/bile

src/http/extractor.rs@6e060abc1f25c2e1b79fe06bfa8b72cd26952ee1

raw
Date Commit Message Author Files + -
2026-02-19 17:51 large refactoring wayverd 53 2153 1683
...

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