#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[non_exhaustive]
pub enum StringClass {
Char,
String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[non_exhaustive]
pub enum OneDimensionalMode {
ColumnVector,
RowVector,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[non_exhaustive]
pub enum NullPolicy {
EmptyStructArray,
Error,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[non_exhaustive]
pub enum InvalidNamePolicy {
Error,
Sanitize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[non_exhaustive]
pub enum UnsupportedPolicy {
Error,
StringFallback,
LossyNumericWidening,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[non_exhaustive]
pub enum Compression {
None,
Deflate {
level: u8,
shuffle: bool,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[non_exhaustive]
pub enum RowMajorPolicy {
ReorderToColumnMajor,
Error,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[non_exhaustive]
pub enum EmptyMarkerEncoding {
ZeroElement,
DataAsDims,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[non_exhaustive]
pub struct Options {
pub string_class: StringClass,
pub compression: Compression,
pub invalid_name_policy: InvalidNamePolicy,
pub null_policy: NullPolicy,
pub unsupported_policy: UnsupportedPolicy,
pub one_dimensional_mode: OneDimensionalMode,
pub row_major_policy: RowMajorPolicy,
pub empty_marker_encoding: EmptyMarkerEncoding,
}
impl Default for Options {
fn default() -> Self {
Self {
string_class: StringClass::Char,
compression: Compression::None,
invalid_name_policy: InvalidNamePolicy::Error,
null_policy: NullPolicy::EmptyStructArray,
unsupported_policy: UnsupportedPolicy::Error,
one_dimensional_mode: OneDimensionalMode::ColumnVector,
row_major_policy: RowMajorPolicy::ReorderToColumnMajor,
empty_marker_encoding: EmptyMarkerEncoding::ZeroElement,
}
}
}
impl Options {
pub fn with_modern_strings() -> Self {
Self {
string_class: StringClass::String,
empty_marker_encoding: EmptyMarkerEncoding::DataAsDims,
..Self::default()
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_matches_legacy_serde_writer() {
let o = Options::default();
assert_eq!(o.string_class, StringClass::Char);
assert_eq!(o.invalid_name_policy, InvalidNamePolicy::Error);
assert_eq!(o.empty_marker_encoding, EmptyMarkerEncoding::ZeroElement);
}
#[test]
fn modern_strings_constructor() {
let o = Options::with_modern_strings();
assert_eq!(o.string_class, StringClass::String);
assert_eq!(o.empty_marker_encoding, EmptyMarkerEncoding::DataAsDims);
}
}