Skip to main content

Decoder

Trait Decoder 

Source
pub trait Decoder {
    // Required methods
    fn decode_blob(&self, data: &[u8]) -> Result<Blob, VctrlError>;
    fn decode_tree(&self, data: &[u8]) -> Result<Tree, VctrlError>;
    fn decode_commit(&self, data: &[u8]) -> Result<Commit, VctrlError>;
    fn decode_tag(&self, data: &[u8]) -> Result<Tag, VctrlError>;
}
Expand description

Re-exports of the core behavior traits.

§Purpose

Provides direct access to the interfaces that define VCS behavior, such as ObjectStore for persistence and Encoder for serialization.

§Examples

use libvctrl::{Hasher, Hash};

struct MyHasher;
impl Hasher for MyHasher {
    fn hash(&self, _data: &[u8]) -> Hash {
        Hash::from_bytes(&[0u8; 64]).unwrap()
    }
}

Defines the interface for deserializing version control objects.

§Purpose

A Decoder translates byte vectors back into in-memory data structures. It is the inverse of Encoder.

§Design Rationale

Decoding can fail due to corrupted data, malformed inputs, or version mismatches, hence every method returns a Result with VctrlError.

§Examples

use libvctrl_handler::{Blob, Commit, Decoder, Hash, Tag, Tree, UserID, VctrlError};

struct DummyDecoder;
impl Decoder for DummyDecoder {
    fn decode_blob(&self, data: &[u8]) -> Result<Blob, VctrlError> {
        Ok(Blob::new(data.to_vec()))
    }
    fn decode_tree(&self, _data: &[u8]) -> Result<Tree, VctrlError> { Tree::new(vec![]) }
    fn decode_commit(&self, _data: &[u8]) -> Result<Commit, VctrlError> {
        let tree = Hash::from_bytes(&[0u8; 64])?;
        let user = UserID::new("a".to_string(), "b".to_string())?;
        Ok(Commit::new(tree, vec![], user.clone(), user, String::new()))
    }
    fn decode_tag(&self, _data: &[u8]) -> Result<Tag, VctrlError> {
        let target = Hash::from_bytes(&[0u8; 64])?;
        Tag::new("tag".to_string(), target, None, String::new())
    }
}

let decoder = DummyDecoder;
let blob = decoder.decode_blob(b"data").unwrap();
assert_eq!(blob.data(), b"data");

Required Methods§

Source

fn decode_blob(&self, data: &[u8]) -> Result<Blob, VctrlError>

Decodes a byte slice into a Blob.

§Errors

Returns VctrlError::CorruptedData if the bytes are malformed.

§Examples
let decoder = DecoderImpl;
let blob = decoder.decode_blob(b"data").unwrap();
assert_eq!(blob.size(), 4);
Source

fn decode_tree(&self, data: &[u8]) -> Result<Tree, VctrlError>

Decodes a byte slice into a Tree.

§Errors

Returns VctrlError::CorruptedData if the bytes are malformed.

§Examples
let decoder = DecoderImpl;
let tree = decoder.decode_tree(b"").unwrap();
assert!(tree.entries().is_empty());
Source

fn decode_commit(&self, data: &[u8]) -> Result<Commit, VctrlError>

Decodes a byte slice into a Commit.

§Errors

Returns VctrlError::CorruptedData if the bytes are malformed.

§Examples
let decoder = DecoderImpl;
let commit = decoder.decode_commit(b"").unwrap();
assert_eq!(commit.message(), "");
Source

fn decode_tag(&self, data: &[u8]) -> Result<Tag, VctrlError>

Decodes a byte slice into a Tag.

§Errors

Returns VctrlError::CorruptedData if the bytes are malformed.

§Examples
let decoder = DecoderImpl;
let tag = decoder.decode_tag(b"").unwrap();
assert_eq!(tag.name(), "t");

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§