Crates.io | vecdb_derive |
lib.rs | vecdb_derive |
version | 0.2.5 |
created_at | 2025-08-09 10:19:34.480728+00 |
updated_at | 2025-08-26 06:30:12.092301+00 |
description | Derive for vecdb |
homepage | https://github.com/seqdb/seqdb |
repository | https://github.com/seqdb/seqdb |
max_upload_size | |
id | 1787794 |
size | 9,122 |
Procedural macros for vecdb that enable custom types to work with compressed storage.
This crate provides derive macros that automatically implement compression traits for custom wrapper types, allowing them to be used seamlessly with vecdb's compressed storage variants.
StoredCompressed
for wrapper types#[derive(StoredCompressed)]
Automatically implements compression traits for single-field tuple structs.
Requirements:
StoredCompressed
use vecdb_derive::StoredCompressed;
use vecdb::{CompressedVec, Database, Version};
// Type-safe wrappers around numeric types
#[derive(StoredCompressed, Debug, Clone, Copy, PartialEq)]
struct UserId(u32);
#[derive(StoredCompressed, Debug, Clone, Copy, PartialEq)]
struct Score(f64);
fn main() -> Result<(), Box<dyn std::error::Error>> {
let db = Database::open("data")?;
// Use custom types in compressed vectors
let mut scores: CompressedVec<UserId, Score> =
CompressedVec::forced_import(&db, "user_scores", Version::TWO)?;
scores.push(Score(95.5));
scores.push(Score(87.2));
scores.flush()?;
Ok(())
}
use vecdb_derive::StoredCompressed;
// Generic wrapper preserves compression characteristics
#[derive(StoredCompressed, Debug, Clone, Copy, PartialEq)]
struct Metric<T>(T);
// Can be used with any StoredCompressed type
type Temperature = Metric<f32>;
type Count = Metric<u64>;
use vecdb_derive::StoredCompressed;
use vecdb::{CompressedVec, Database, Version};
#[derive(StoredCompressed, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
struct Timestamp(u64);
#[derive(StoredCompressed, Debug, Clone, Copy, PartialEq)]
struct SensorReading(f32);
fn main() -> Result<(), Box<dyn std::error::Error>> {
let db = Database::open("sensors")?;
let mut readings: CompressedVec<Timestamp, SensorReading> =
CompressedVec::forced_import(&db, "temperature", Version::TWO)?;
let now = Timestamp(1640995200);
readings.push(SensorReading(23.5));
readings.flush()?;
Ok(())
}
For a simple wrapper:
#[derive(StoredCompressed)]
struct UserId(u32);
The macro generates:
impl ::vecdb::TransparentStoredCompressed<u32> for UserId {}
impl StoredCompressed for UserId {
type NumberType = u32;
}
For generic types:
#[derive(StoredCompressed)]
struct Wrapper<T>(T);
The macro generates:
impl<T> ::vecdb::TransparentStoredCompressed<T::NumberType> for Wrapper<T>
where T: StoredCompressed {}
impl<T> StoredCompressed for Wrapper<T>
where T: StoredCompressed {
type NumberType = T::NumberType;
}
Clear error messages for common mistakes:
StoredCompressed
Use #[derive(StoredCompressed)]
to:
Derived types work with all vecdb storage variants:
CompressedVec<I, T>
: Compressed storageRawVec<I, T>
: Uncompressed storageComputedVec
: Derived data storageThis README was generated by Claude Code