2 releases

0.1.1 May 23, 2024
0.1.0 May 23, 2024

#421 in Encoding

Download history 273/week @ 2024-05-20 8/week @ 2024-05-27 21/week @ 2024-06-03

302 downloads per month
Used in 3 crates (2 directly)

MIT license

52KB
1.5K SLoC

hdv

Header determined values.

CSV but can be parsed in a multi-layer struct.

Usage

Import dependencies

use std::sync::Arc;

use hdv::{
    format::AtomValue,
    io::{
        bin::{HdvBinReader, HdvBinWriter},
        text::{HdvTextReader, HdvTextWriter, HdvTextWriterOptions},
    },
    serde::{HdvDeserialize, HdvSerialize},
};
use hdv_derive::HdvSerde;

Write and read data in binary format

#[derive(Debug, HdvSerde, PartialEq)]
pub struct A {
    a: u16,
    b: Option<B>,
    c: Option<f64>,
    d: B,
}
#[derive(Debug, HdvSerde, PartialEq)]
struct B {
    a: Arc<[u8]>,
    b: i64,
    c: Arc<str>,
    d: Option<Arc<[u8]>>,
}

let a = A {
    a: 1,
    b: None,
    c: Some(3.),
    d: B {
        a: b"hello".as_ref().into(),
        b: 2,
        c: "world".into(),
        d: None,
    },
};

let mut buf = vec![];
let mut writer = HdvBinWriter::new(&mut buf);
writer.write(&a).unwrap();
writer.flush().unwrap();

let mut reader = HdvBinReader::new(std::io::Cursor::new(&buf));
let a_: A = reader.read().unwrap();
assert_eq!(a, a_);

#[derive(Debug, HdvSerde, PartialEq)]
pub struct PartialA {
    c: Option<f64>,
    a: u16,
}

let mut reader = HdvBinReader::new(std::io::Cursor::new(&buf));
let partial_a: PartialA = reader.read().unwrap();
assert_eq!(a.a, partial_a.a);
assert_eq!(a.c, partial_a.c);

Write and read data in text format

Currently the text format does not accept:

  • bytes (Vec<u8>);
  • strings containing any of the chars ,, ", and \n or starting with whitespace characters.
#[derive(Debug, HdvSerde, PartialEq)]
pub struct A {
    a: u16,
    b: Option<B>,
    c: Option<f64>,
    d: B,
}
#[derive(Debug, HdvSerde, PartialEq)]
struct B {
    b: i64,
    c: Arc<str>,
}

let a = A {
    a: 1,
    b: None,
    c: Some(3.),
    d: B {
        b: 2,
        c: "world".into(),
    },
};

let mut buf = vec![];
let options = HdvTextWriterOptions {
    is_csv_header: false,
};
let mut writer = HdvTextWriter::new(&mut buf, options);
writer.write(&a).unwrap();
writer.flush().unwrap();

let mut reader = HdvTextReader::new(std::io::Cursor::new(&buf));
let a_: A = reader.read().unwrap();
assert_eq!(a, a_);

#[derive(Debug, HdvSerde, PartialEq)]
pub struct PartialA {
    c: Option<f64>,
    a: u16,
}

let mut reader = HdvTextReader::new(std::io::Cursor::new(&buf));
let partial_a: PartialA = reader.read().unwrap();
assert_eq!(a.a, partial_a.a);
assert_eq!(a.c, partial_a.c);

Dependencies

~1.3–4.5MB
~87K SLoC