Skip to main content

gix_object/tag/
mod.rs

1use bstr::ByteSlice;
2use gix_error::ExnMessageResult;
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) -> 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    /// The object this tag points to as `Id`.
25    pub fn target(&self) -> gix_hash::ObjectId {
26        gix_hash::ObjectId::from_hex(self.target).expect("prior validation")
27    }
28
29    /// Return the tagger, if present.
30    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    /// Return the in-body cryptographic signature and its detected format.
39    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    /// Copy all data into a fully-owned instance.
46    pub fn into_owned(self) -> ExnMessageResult<crate::Tag> {
47        self.try_into()
48    }
49}
50
51impl Tag {
52    /// Return the in-body cryptographic signature and its detected format.
53    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}