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
153fn steal_from_freelist(data: &mut Vec<u8>) -> Vec<u8> {
156 std::mem::take(data)
157}