[go: up one dir, main page]

gix/object/
impls.rs

1use crate::{object, Blob, Commit, Object, ObjectDetached, Tag, Tree};
2
3impl<'repo> From<Object<'repo>> for ObjectDetached {
4    fn from(mut v: Object<'repo>) -> Self {
5        ObjectDetached {
6            id: v.id,
7            kind: v.kind,
8            data: steal_from_freelist(&mut v.data),
9        }
10    }
11}
12
13impl<'repo> From<Commit<'repo>> for ObjectDetached {
14    fn from(mut v: Commit<'repo>) -> Self {
15        ObjectDetached {
16            id: v.id,
17            kind: gix_object::Kind::Commit,
18            data: steal_from_freelist(&mut v.data),
19        }
20    }
21}
22
23impl<'repo> From<Tag<'repo>> for ObjectDetached {
24    fn from(mut v: Tag<'repo>) -> Self {
25        ObjectDetached {
26            id: v.id,
27            kind: gix_object::Kind::Tag,
28            data: steal_from_freelist(&mut v.data),
29        }
30    }
31}
32
33impl<'repo> From<Blob<'repo>> for ObjectDetached {
34    fn from(mut v: Blob<'repo>) -> Self {
35        ObjectDetached {
36            id: v.id,
37            kind: gix_object::Kind::Blob,
38            data: steal_from_freelist(&mut v.data),
39        }
40    }
41}
42
43impl<'repo> From<Tree<'repo>> for ObjectDetached {
44    fn from(mut v: Tree<'repo>) -> Self {
45        ObjectDetached {
46            id: v.id,
47            kind: gix_object::Kind::Tree,
48            data: steal_from_freelist(&mut v.data),
49        }
50    }
51}
52
53impl<'repo> From<Commit<'repo>> for Object<'repo> {
54    fn from(mut v: Commit<'repo>) -> Self {
55        Object {
56            id: v.id,
57            kind: gix_object::Kind::Commit,
58            data: steal_from_freelist(&mut v.data),
59            repo: v.repo,
60        }
61    }
62}
63
64impl AsRef<[u8]> for Object<'_> {
65    fn as_ref(&self) -> &[u8] {
66        &self.data
67    }
68}
69
70impl AsRef<[u8]> for ObjectDetached {
71    fn as_ref(&self) -> &[u8] {
72        &self.data
73    }
74}
75
76impl<'repo> TryFrom<Object<'repo>> for Commit<'repo> {
77    type Error = Object<'repo>;
78
79    fn try_from(mut value: Object<'repo>) -> Result<Self, Self::Error> {
80        let repo = value.repo;
81        match value.kind {
82            object::Kind::Commit => Ok(Commit {
83                id: value.id,
84                repo,
85                data: steal_from_freelist(&mut value.data),
86            }),
87            _ => Err(value),
88        }
89    }
90}
91
92impl<'repo> TryFrom<Object<'repo>> for Tag<'repo> {
93    type Error = Object<'repo>;
94
95    fn try_from(mut value: Object<'repo>) -> Result<Self, Self::Error> {
96        let repo = value.repo;
97        match value.kind {
98            object::Kind::Tag => Ok(Tag {
99                id: value.id,
100                repo,
101                data: steal_from_freelist(&mut value.data),
102            }),
103            _ => Err(value),
104        }
105    }
106}
107
108impl<'repo> TryFrom<Object<'repo>> for Tree<'repo> {
109    type Error = Object<'repo>;
110
111    fn try_from(mut value: Object<'repo>) -> Result<Self, Self::Error> {
112        let repo = value.repo;
113        match value.kind {
114            object::Kind::Tree => Ok(Tree {
115                id: value.id,
116                repo,
117                data: steal_from_freelist(&mut value.data),
118            }),
119            _ => Err(value),
120        }
121    }
122}
123
124impl<'repo> TryFrom<Object<'repo>> for Blob<'repo> {
125    type Error = Object<'repo>;
126
127    fn try_from(mut value: Object<'repo>) -> Result<Self, Self::Error> {
128        let repo = value.repo;
129        match value.kind {
130            object::Kind::Blob => Ok(Blob {
131                id: value.id,
132                repo,
133                data: steal_from_freelist(&mut value.data),
134            }),
135            _ => Err(value),
136        }
137    }
138}
139
140impl std::fmt::Debug for Object<'_> {
141    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
142        use gix_object::Kind::*;
143        let type_name = match self.kind {
144            Blob => "Blob",
145            Commit => "Commit",
146            Tree => "Tree",
147            Tag => "Tag",
148        };
149        write!(f, "{}({})", type_name, self.id)
150    }
151}
152
153/// In conjunction with the handles free list, leaving an empty Vec in place of the original causes it to not be
154/// returned to the free list.
155fn steal_from_freelist(data: &mut Vec<u8>) -> Vec<u8> {
156    std::mem::take(data)
157}