haystack_core/codecs/
mod.rs1pub mod csv;
4pub mod json;
5pub mod rdf;
6pub mod shared;
7pub mod trio;
8pub mod zinc;
9
10use crate::data::HGrid;
11use crate::kinds::Kind;
12
13#[derive(Debug, thiserror::Error)]
15pub enum CodecError {
16 #[error("parse error at position {pos}: {message}")]
17 Parse { pos: usize, message: String },
18 #[error("encoding error: {0}")]
19 Encode(String),
20 #[error("unsupported kind for this codec")]
21 UnsupportedKind,
22}
23
24pub trait Codec: Send + Sync {
26 fn mime_type(&self) -> &str;
28
29 fn encode_grid(&self, grid: &HGrid) -> Result<String, CodecError>;
31
32 fn decode_grid(&self, input: &str) -> Result<HGrid, CodecError>;
34
35 fn encode_scalar(&self, val: &Kind) -> Result<String, CodecError>;
37
38 fn decode_scalar(&self, input: &str) -> Result<Kind, CodecError>;
40}
41
42static ZINC: zinc::ZincCodec = zinc::ZincCodec;
43static TRIO: trio::TrioCodec = trio::TrioCodec;
44static JSON4: json::Json4Codec = json::Json4Codec;
45static JSON3: json::Json3Codec = json::Json3Codec;
46static CSV: csv::CsvCodec = csv::CsvCodec;
47
48pub fn codec_for(mime_type: &str) -> Option<&'static dyn Codec> {
53 match mime_type {
54 "text/zinc" => Some(&ZINC),
55 "text/trio" => Some(&TRIO),
56 "application/json" => Some(&JSON4),
57 "application/json;v=3" => Some(&JSON3),
58 "text/csv" => Some(&CSV),
59 _ => None,
60 }
61}