1use bstr::ByteSlice;
2use gix_error::ExnMessageResult;
3
4use crate::parse::parse_signature;
5use crate::{Tag, TagRef};
6
7mod decode;
8
9pub mod write;
11
12pub mod ref_iter;
14
15impl<'a> TagRef<'a> {
16 pub fn from_bytes(mut data: &'a [u8], hash_kind: gix_hash::Kind) -> ExnMessageResult<TagRef<'a>> {
18 let input = &mut data;
19 match decode::git_tag(input, hash_kind) {
20 Ok(tag) => Ok(tag),
21 Err(err) => Err(err),
22 }
23 }
24 pub fn target(&self) -> gix_hash::ObjectId {
26 gix_hash::ObjectId::from_hex(self.target).expect("prior validation")
27 }
28
29 pub fn tagger(&self) -> ExnMessageResult<Option<gix_actor::SignatureRef<'a>>> {
31 Ok(self
32 .tagger
33 .map(parse_signature)
34 .transpose()?
35 .map(|signature| signature.trim()))
36 }
37
38 pub fn signature(&self) -> Option<crate::signature::SignatureRef<'a>> {
40 self.signature.and_then(|data| {
41 crate::signature::Format::from_signature(data).map(|format| crate::signature::SignatureRef { format, data })
42 })
43 }
44
45 pub fn into_owned(self) -> ExnMessageResult<crate::Tag> {
47 self.try_into()
48 }
49}
50
51impl Tag {
52 pub fn signature(&self) -> Option<crate::signature::SignatureRef<'_>> {
54 self.signature.as_ref().and_then(|data| {
55 let data = data.as_bstr();
56 crate::signature::Format::from_signature(data).map(|format| crate::signature::SignatureRef { format, data })
57 })
58 }
59}