gix_object/object/
convert.rs1use gix_error::{Exn, Message};
2use std::convert::TryFrom;
3
4use crate::parse::parse_signature;
5use crate::{Blob, BlobRef, Commit, CommitRef, Object, ObjectRef, Tag, TagRef, Tree, TreeRef, tree};
6
7impl TryFrom<TagRef<'_>> for Tag {
8 type Error = Exn<Message>;
9
10 fn try_from(other: TagRef<'_>) -> std::result::Result<Tag, Self::Error> {
11 let TagRef {
12 target,
13 name,
14 target_kind,
15 message,
16 tagger,
17 signature,
18 } = other;
19 let untrimmed_tagger = tagger.map(parse_signature).transpose()?.map(Into::into);
20 Ok(Tag {
21 target: gix_hash::ObjectId::from_hex(target).expect("prior parser validation"),
22 name: name.to_owned(),
23 target_kind,
24 message: message.to_owned(),
25 tagger: untrimmed_tagger,
26 signature: signature.map(ToOwned::to_owned),
27 })
28 }
29}
30
31impl TryFrom<CommitRef<'_>> for Commit {
32 type Error = Exn<Message>;
33
34 fn try_from(other: CommitRef<'_>) -> std::result::Result<Commit, Self::Error> {
35 let CommitRef {
36 tree,
37 parents,
38 author,
39 committer,
40 encoding,
41 message,
42 extra_headers,
43 } = other;
44
45 let untrimmed_author = parse_signature(author)?;
46 let untrimmed_committer = parse_signature(committer)?;
47 Ok(Commit {
48 tree: gix_hash::ObjectId::from_hex(tree).expect("prior parser validation"),
49 parents: parents
50 .iter()
51 .map(|parent| gix_hash::ObjectId::from_hex(parent).expect("prior parser validation"))
52 .collect(),
53 author: untrimmed_author.into(),
54 committer: untrimmed_committer.into(),
55 encoding: encoding.map(ToOwned::to_owned),
56 message: message.to_owned(),
57 extra_headers: extra_headers
58 .into_iter()
59 .map(|(k, v)| (k.into(), v.into_owned()))
60 .collect(),
61 })
62 }
63}
64
65impl<'a> From<BlobRef<'a>> for Blob {
66 fn from(v: BlobRef<'a>) -> Self {
67 Blob {
68 data: v.data.to_owned(),
69 }
70 }
71}
72
73impl From<TreeRef<'_>> for Tree {
74 fn from(other: TreeRef<'_>) -> Tree {
75 let TreeRef { entries } = other;
76 Tree {
77 entries: entries.into_iter().map(Into::into).collect(),
78 }
79 }
80}
81
82impl From<tree::EntryRef<'_>> for tree::Entry {
83 fn from(other: tree::EntryRef<'_>) -> tree::Entry {
84 let tree::EntryRef { mode, filename, oid } = other;
85 tree::Entry {
86 mode,
87 filename: filename.to_owned(),
88 oid: oid.into(),
89 }
90 }
91}
92
93impl<'a> From<&'a tree::Entry> for tree::EntryRef<'a> {
94 fn from(other: &'a tree::Entry) -> tree::EntryRef<'a> {
95 let tree::Entry { mode, filename, oid } = other;
96 tree::EntryRef {
97 mode: *mode,
98 filename: filename.as_ref(),
99 oid,
100 }
101 }
102}
103
104impl TryFrom<ObjectRef<'_>> for Object {
105 type Error = Exn<Message>;
106
107 fn try_from(v: ObjectRef<'_>) -> std::result::Result<Self, Self::Error> {
108 Ok(match v {
109 ObjectRef::Tree(v) => Object::Tree(v.into()),
110 ObjectRef::Blob(v) => Object::Blob(v.into()),
111 ObjectRef::Commit(v) => Object::Commit(v.try_into()?),
112 ObjectRef::Tag(v) => Object::Tag(v.try_into()?),
113 })
114 }
115}
116
117impl From<Tag> for Object {
118 fn from(v: Tag) -> Self {
119 Object::Tag(v)
120 }
121}
122
123impl From<Commit> for Object {
124 fn from(v: Commit) -> Self {
125 Object::Commit(v)
126 }
127}
128
129impl From<Tree> for Object {
130 fn from(v: Tree) -> Self {
131 Object::Tree(v)
132 }
133}
134
135impl From<Blob> for Object {
136 fn from(v: Blob) -> Self {
137 Object::Blob(v)
138 }
139}
140
141impl TryFrom<Object> for Tag {
142 type Error = Object;
143
144 fn try_from(value: Object) -> std::result::Result<Self, Self::Error> {
145 Ok(match value {
146 Object::Tag(v) => v,
147 _ => return Err(value),
148 })
149 }
150}
151
152impl TryFrom<Object> for Commit {
153 type Error = Object;
154
155 fn try_from(value: Object) -> std::result::Result<Self, Self::Error> {
156 Ok(match value {
157 Object::Commit(v) => v,
158 _ => return Err(value),
159 })
160 }
161}
162
163impl TryFrom<Object> for Tree {
164 type Error = Object;
165
166 fn try_from(value: Object) -> std::result::Result<Self, Self::Error> {
167 Ok(match value {
168 Object::Tree(v) => v,
169 _ => return Err(value),
170 })
171 }
172}
173
174impl TryFrom<Object> for Blob {
175 type Error = Object;
176
177 fn try_from(value: Object) -> std::result::Result<Self, Self::Error> {
178 Ok(match value {
179 Object::Blob(v) => v,
180 _ => return Err(value),
181 })
182 }
183}
184
185impl<'a> From<TagRef<'a>> for ObjectRef<'a> {
186 fn from(v: TagRef<'a>) -> Self {
187 ObjectRef::Tag(v)
188 }
189}
190
191impl<'a> From<CommitRef<'a>> for ObjectRef<'a> {
192 fn from(v: CommitRef<'a>) -> Self {
193 ObjectRef::Commit(v)
194 }
195}
196
197impl<'a> From<TreeRef<'a>> for ObjectRef<'a> {
198 fn from(v: TreeRef<'a>) -> Self {
199 ObjectRef::Tree(v)
200 }
201}
202
203impl<'a> From<BlobRef<'a>> for ObjectRef<'a> {
204 fn from(v: BlobRef<'a>) -> Self {
205 ObjectRef::Blob(v)
206 }
207}
208
209impl<'a> TryFrom<ObjectRef<'a>> for TagRef<'a> {
210 type Error = ObjectRef<'a>;
211
212 fn try_from(value: ObjectRef<'a>) -> std::result::Result<Self, Self::Error> {
213 Ok(match value {
214 ObjectRef::Tag(v) => v,
215 _ => return Err(value),
216 })
217 }
218}
219
220impl<'a> TryFrom<ObjectRef<'a>> for CommitRef<'a> {
221 type Error = ObjectRef<'a>;
222
223 fn try_from(value: ObjectRef<'a>) -> std::result::Result<Self, Self::Error> {
224 Ok(match value {
225 ObjectRef::Commit(v) => v,
226 _ => return Err(value),
227 })
228 }
229}
230
231impl<'a> TryFrom<ObjectRef<'a>> for TreeRef<'a> {
232 type Error = ObjectRef<'a>;
233
234 fn try_from(value: ObjectRef<'a>) -> std::result::Result<Self, Self::Error> {
235 Ok(match value {
236 ObjectRef::Tree(v) => v,
237 _ => return Err(value),
238 })
239 }
240}
241
242impl<'a> TryFrom<ObjectRef<'a>> for BlobRef<'a> {
243 type Error = ObjectRef<'a>;
244
245 fn try_from(value: ObjectRef<'a>) -> std::result::Result<Self, Self::Error> {
246 Ok(match value {
247 ObjectRef::Blob(v) => v,
248 _ => return Err(value),
249 })
250 }
251}