7 releases (4 breaking)

0.5.0 Nov 2, 2024
0.4.1 Sep 19, 2024
0.3.0 Aug 20, 2024
0.2.0 Jun 28, 2024
0.1.1 May 23, 2024

#1398 in Encoding

Download history 173/week @ 2024-08-19 46/week @ 2024-08-26 8/week @ 2024-09-02 9/week @ 2024-09-09 209/week @ 2024-09-16 82/week @ 2024-09-23 29/week @ 2024-09-30 9/week @ 2024-10-07 18/week @ 2024-10-14 16/week @ 2024-10-21 122/week @ 2024-10-28 45/week @ 2024-11-04 10/week @ 2024-11-11 23/week @ 2024-11-18 17/week @ 2024-11-25 18/week @ 2024-12-02

71 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

~2–11MB
~128K SLoC