gitscope
← rgit / 0.1.2 / src/database/schema/prefixes.rs
https://dev.kronoz.win/r/rgit.git
src/database/schema/prefixes.rs · Rust
Blame Raw
 1use std::path::Path;
 2
 3use crate::database::schema::repository::RepositoryId;
 4
 5#[repr(u8)]
 6pub enum TreePrefix {
 7    Repository = 0,
 8    Commit = 100,
 9    Tag = 101,
10}
11
12impl TreePrefix {
13    pub fn repository_id<T: AsRef<Path>>(path: T) -> Vec<u8> {
14        let path = path.as_ref().to_string_lossy();
15        let path_bytes = path.as_bytes();
16
17        let mut prefixed = Vec::with_capacity(path_bytes.len() + std::mem::size_of::<TreePrefix>());
18        prefixed.push(Self::Repository as u8);
19        prefixed.extend_from_slice(path_bytes);
20
21        prefixed
22    }
23
24    pub fn commit_id<T: AsRef<[u8]>>(repository: RepositoryId, reference: T) -> Vec<u8> {
25        let reference = reference.as_ref();
26
27        let mut prefixed = Vec::with_capacity(
28            reference.len()
29                + std::mem::size_of::<RepositoryId>()
30                + std::mem::size_of::<TreePrefix>(),
31        );
32        prefixed.push(TreePrefix::Commit as u8);
33        prefixed.extend_from_slice(&repository.to_ne_bytes());
34        prefixed.extend_from_slice(reference);
35
36        prefixed
37    }
38
39    pub fn tag_id(repository: RepositoryId) -> Vec<u8> {
40        let mut prefixed = Vec::with_capacity(
41            std::mem::size_of::<TreePrefix>() + std::mem::size_of::<RepositoryId>(),
42        );
43        prefixed.push(TreePrefix::Tag as u8);
44        prefixed.extend_from_slice(&repository.to_ne_bytes());
45
46        prefixed
47    }
48}