Skip to main content

gix_object/tag/
mod.rs

1use bstr::ByteSlice;
2use gix_error::Result;
3
4use crate::parse::parse_signature;
5use crate::{Tag, TagRef};
6
7mod decode;
8
9///
10pub mod write;
11
12///
13pub mod ref_iter;
14
15impl<'a> TagRef<'a> {
16    /// Deserialize a tag from `data`.
17    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    /// The object this tag points to as `Id`.
21    pub fn target(&self) -> gix_hash::ObjectId {
22        gix_hash::ObjectId::from_hex(self.target).expect("prior validation")
23    }
24
25    /// Return the tagger, if present.
26    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    /// Return the in-body cryptographic signature and its detected format.
35    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    /// Copy all data into a fully-owned instance.
42    pub fn into_owned(self) -> Result<crate::Tag> {
43        self.try_into()
44    }
45}
46
47impl Tag {
48    /// Return the in-body cryptographic signature and its detected format.
49    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}