1use bstr::ByteSlice;
2use gix_error::Result;
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) -> Result<TagRef<'a>> {
18 decode::git_tag(&mut data, hash_kind)
19 }
20 pub fn target(&self) -> gix_hash::ObjectId {
22 gix_hash::ObjectId::from_hex(self.target).expect("prior validation")
23 }
24
25 pub fn tagger(&self) -> Result<Option<gix_actor::SignatureRef<'a>>> {
27 Ok(self
28 .tagger
29 .map(parse_signature)
30 .transpose()?
31 .map(|signature| signature.trim()))
32 }
33
34 pub fn signature(&self) -> Option<crate::signature::SignatureRef<'a>> {
36 self.signature.and_then(|data| {
37 crate::signature::Format::from_signature(data).map(|format| crate::signature::SignatureRef { format, data })
38 })
39 }
40
41 pub fn into_owned(self) -> Result<crate::Tag> {
43 self.try_into()
44 }
45}
46
47impl Tag {
48 pub fn signature(&self) -> Option<crate::signature::SignatureRef<'_>> {
50 self.signature.as_ref().and_then(|data| {
51 let data = data.as_bstr();
52 crate::signature::Format::from_signature(data).map(|format| crate::signature::SignatureRef { format, data })
53 })
54 }
55}