use serde::{Deserialize, Serialize};
use nodedb_codec::ColumnCodec;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbeddedDecoder {
pub module_id: String,
pub module_hash: String,
pub module_size: u64,
pub codec: ColumnCodec,
pub min_native_version: String,
}
#[derive(Debug, PartialEq, Eq)]
pub enum DecodeStrategy {
Native,
NeedWasm(String), Unsupported,
}
pub fn resolve_decode_strategy(
codec: ColumnCodec,
decoder: Option<&EmbeddedDecoder>,
known_codecs: &[ColumnCodec],
) -> DecodeStrategy {
if known_codecs.contains(&codec) {
return DecodeStrategy::Native;
}
match decoder {
Some(d) => DecodeStrategy::NeedWasm(d.module_id.clone()),
None => DecodeStrategy::Unsupported,
}
}
pub fn supported_codecs() -> Vec<ColumnCodec> {
vec![
ColumnCodec::AlpFastLanesLz4,
ColumnCodec::AlpRdLz4,
ColumnCodec::PcodecLz4,
ColumnCodec::DeltaFastLanesLz4,
ColumnCodec::FastLanesLz4,
ColumnCodec::FsstLz4,
ColumnCodec::AlpFastLanesRans,
ColumnCodec::DeltaFastLanesRans,
ColumnCodec::FsstRans,
ColumnCodec::Gorilla,
ColumnCodec::DoubleDelta,
ColumnCodec::Delta,
ColumnCodec::Lz4,
ColumnCodec::Zstd,
ColumnCodec::Raw,
]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn native_codec_resolves() {
let known = supported_codecs();
assert_eq!(
resolve_decode_strategy(ColumnCodec::AlpFastLanesLz4, None, &known),
DecodeStrategy::Native
);
}
#[test]
fn unknown_codec_with_decoder() {
let decoder = EmbeddedDecoder {
module_id: "nodedb-codec-v3-future".into(),
module_hash: "abc123".into(),
module_size: 4096,
codec: ColumnCodec::Raw, min_native_version: "99.0.0".into(),
};
assert_eq!(
resolve_decode_strategy(ColumnCodec::Raw, Some(&decoder), &[]),
DecodeStrategy::NeedWasm("nodedb-codec-v3-future".into())
);
}
#[test]
fn unknown_codec_no_decoder() {
assert_eq!(
resolve_decode_strategy(ColumnCodec::Raw, None, &[]),
DecodeStrategy::Unsupported
);
}
#[test]
fn supported_codecs_complete() {
let codecs = supported_codecs();
assert_eq!(codecs.len(), 15);
assert!(codecs.contains(&ColumnCodec::AlpFastLanesLz4));
assert!(codecs.contains(&ColumnCodec::FsstRans));
assert!(
!codecs.contains(&ColumnCodec::Auto),
"Auto must not appear in supported_codecs"
);
}
}