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§
Sourcefn decode_blob(&self, data: &[u8]) -> Result<Blob, VctrlError>
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);Sourcefn decode_tree(&self, data: &[u8]) -> Result<Tree, VctrlError>
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());Sourcefn decode_commit(&self, data: &[u8]) -> Result<Commit, VctrlError>
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(), "");Sourcefn decode_tag(&self, data: &[u8]) -> Result<Tag, VctrlError>
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".