Skip to main content

haystack_core/codecs/zinc/
mod.rs

1// Zinc wire format codec — the primary text-based wire format for Haystack.
2
3mod encoder;
4mod parser;
5
6pub use encoder::{
7    encode_grid, encode_grid_header, encode_grid_row, encode_meta, encode_scalar, escape_str,
8};
9pub use parser::{ZincParser, decode_grid, decode_scalar};
10
11use super::{Codec, CodecError};
12use crate::data::{HCol, HDict, HGrid};
13use crate::kinds::Kind;
14
15/// Zinc wire format codec.
16pub struct ZincCodec;
17
18impl Codec for ZincCodec {
19    fn mime_type(&self) -> &str {
20        "text/zinc"
21    }
22
23    fn encode_grid(&self, grid: &HGrid) -> Result<String, CodecError> {
24        encode_grid(grid)
25    }
26
27    fn decode_grid(&self, input: &str) -> Result<HGrid, CodecError> {
28        decode_grid(input)
29    }
30
31    fn encode_scalar(&self, val: &Kind) -> Result<String, CodecError> {
32        encode_scalar(val)
33    }
34
35    fn decode_scalar(&self, input: &str) -> Result<Kind, CodecError> {
36        decode_scalar(input)
37    }
38
39    fn encode_grid_header(&self, grid: &HGrid) -> Result<Vec<u8>, CodecError> {
40        encoder::encode_grid_header(grid).map(|s| s.into_bytes())
41    }
42
43    fn encode_grid_row(&self, cols: &[HCol], row: &HDict) -> Result<Vec<u8>, CodecError> {
44        encoder::encode_grid_row(cols, row).map(|s| s.into_bytes())
45    }
46}