Qubit Metadata
A general-purpose, type-safe, extensible metadata model for Rust.
Overview
qubit-metadata provides a Metadata type — a structured key-value store
designed for any domain that needs to attach arbitrary, typed, serializable
annotations to its data models. Common use cases include:
- Attaching contextual information to domain entities (messages, records, events)
- Carrying provider- or adapter-specific fields without polluting core models
- Expressing query filter conditions over annotated data (e.g. vector stores)
- Passing through opaque metadata across service or library boundaries
It is not a plain HashMap<String, String>. It is a domain-level extensibility
point with type-safe access, serde_json::Value backing, and first-class
serde support.
Design Goals
- Type Safety: Typed get/set API backed by
serde_json::Value - Generality: No domain-specific assumptions — usable in any Rust project
- Extensibility: Acts as a structured extension point, not a stringly-typed bag
- Serialization: First-class
serdesupport for JSON interchange - Filtering:
MetadataFilterfor composable predicates overMetadata
Features
🗂 Metadata
- Ordered key-value store with
Stringkeys andserde_json::Valuevalues - Two typed access layers: convenience
get::<T>()/set()and explicittry_get::<T>()/try_set() - Lightweight JSON value type inspection via
MetadataValueType - Merge, extend, and iterate operations
- Full
serdeserialization / deserialization support Debug,Clone,PartialEq,Defaultderives
🔍 MetadataFilter
- Composable tree of conditions over metadata keys, evaluated with
matches(&metadata) - Comparison, existence, and set-membership leaves; logical
and,or, andnot Serialize/Deserializefor persisting or exchanging filter definitions as JSON- Useful for in-memory filtering, query predicates, or any pipeline that needs a portable metadata predicate
Installation
Add to your Cargo.toml:
[]
= "0.2.0"
Usage
use Metadata;
let mut meta = new;
meta.set;
meta.set;
meta.set;
// Convenience API: terse and forgiving.
let author: = meta.get;
assert_eq!;
// Explicit API: preserves failure reasons.
let priority = meta..unwrap;
assert_eq!;
MetadataFilter
MetadataFilter describes a predicate on a single Metadata value. You build a tree of conditions, then call matches to test whether a given Metadata satisfies it.
Leaf constructors
Each leaf inspects one key (values are serialized to serde_json::Value the same way as Metadata::set):
| Constructor | Semantics |
|---|---|
equal, not_equal |
Equality / inequality of the stored JSON value |
greater, greater_equal, less, less_equal |
Ordered comparison (numeric ordering, string lexicographic order, and mixed-type rules as implemented for your value shapes) |
exists, not_exists |
Key present / absent |
in_values, not_in_values |
Membership of the key’s value in a finite set |
Logical combinators
and— all sub-filters must match. Ifselfis already anAndnode, the new filter is appended (flat structure).or— at least one sub-filter must match (same flattening behavior asand).not— negates a filter. The!operator is also implemented viaNotforMetadataFilter.
Edge cases: an And with no children matches every Metadata; an Or with no children matches none.
Evaluation
Call filter.matches(&meta) to obtain a bool. How a missing key interacts with each leaf operator is defined on Condition (for example, equal requires the key to exist; not_equal may still match when the key is absent).
Serde
MetadataFilter implements Serialize and Deserialize, so you can store filters in configuration, databases, or JSON APIs alongside your metadata model.
Examples
AND — all conditions must hold:
use ;
let mut meta = new;
meta.set;
meta.set;
let filter = equal
.and;
assert!;
OR, membership, and negation:
use ;
let mut meta = new;
meta.set;
meta.set;
let filter = in_values
.or;
assert!;
let hide_drafts = equal.not;
// Equivalent: !MetadataFilter::equal("status", "draft")
assert!;
Error Handling
When callers need to distinguish missing keys from type mismatches, prefer the
explicit APIs and inspect MetadataError:
use ;
let mut meta = new;
meta.set;
match meta.
License
Licensed under the Apache License, Version 2.0.