/// The value of a [Variable](crate::dictionary::Variable), with a string
/// encoding.
#[derive(Clone)]
-pub enum EncodedDatum<D = OwnedEncodedString> {
+pub enum EncodedDatum<D> {
/// A numeric value.
Number(
/// A number, or `None` for the system-missing value.
}
}
-impl EncodedDatum {
+impl OwnedEncodedDatum {
/// Resizes this datum to the given `width`. Returns `Ok(())` if
/// successful, if and only if this datum and `width` are both string or
/// both numeric and, for string widths, resizing would not drop any
}
}
-impl Display for EncodedDatum {
+impl<D> Display for EncodedDatum<D>
+where
+ D: Display,
+{
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::Number(None) => write!(f, "SYSMIS"),
}
}
-impl Serialize for EncodedDatum {
+impl<D> Serialize for EncodedDatum<D>
+where
+ D: Serialize,
+{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
}
}
-impl From<f64> for EncodedDatum {
+impl<D> From<f64> for EncodedDatum<D> {
fn from(number: f64) -> Self {
Some(number).into()
}
}
-impl From<Option<f64>> for EncodedDatum {
+impl<D> From<Option<f64>> for EncodedDatum<D> {
fn from(value: Option<f64>) -> Self {
Self::Number(value)
}
}
-impl From<&str> for EncodedDatum {
+impl From<&str> for OwnedEncodedDatum {
fn from(value: &str) -> Self {
Self::String(OwnedEncodedString::from(value))
}
}
impl Datum<OwnedRawString> {
- pub fn with_encoding(self, encoding: &'static Encoding) -> EncodedDatum {
+ pub fn with_encoding(self, encoding: &'static Encoding) -> OwnedEncodedDatum {
match self {
Datum::Number(number) => EncodedDatum::Number(number),
Datum::String(raw_string) => EncodedDatum::String(raw_string.with_encoding(encoding)),
}
impl IntoIterator for Case<Vec<Datum<OwnedRawString>>> {
- type Item = EncodedDatum;
+ type Item = OwnedEncodedDatum;
type IntoIter = CaseVecIter;
}
impl Iterator for CaseVecIter {
- type Item = EncodedDatum;
+ type Item = OwnedEncodedDatum;
fn next(&mut self) -> Option<Self::Item> {
self.iter
use unicase::UniCase;
use crate::{
- data::{BorrowedEncodedDatum, Datum, EncodedDatum, OwnedRawString},
+ data::{BorrowedEncodedDatum, Datum, OwnedEncodedDatum, OwnedRawString},
format::{DisplayPlain, Format},
identifier::{ByIdentifier, HasIdentifier, Identifier},
output::pivot::{
#[derive(Clone, Default, Serialize)]
pub struct MissingValues {
/// Individual missing values, up to 3 of them.
- values: Vec<EncodedDatum>,
+ values: Vec<OwnedEncodedDatum>,
/// Optional range of missing values.
range: Option<MissingValueRange>,
pub fn clear(&mut self) {
*self = Self::default();
}
- pub fn values(&self) -> &[EncodedDatum] {
+ pub fn values(&self) -> &[OwnedEncodedDatum] {
&self.values
}
}
pub fn new(
- mut values: Vec<EncodedDatum>,
+ mut values: Vec<OwnedEncodedDatum>,
range: Option<MissingValueRange>,
) -> Result<Self, MissingValuesError> {
if values.len() > 3 {
use smallvec::SmallVec;
use crate::{
- data::{EncodedDatum, OwnedEncodedDatum},
+ data::OwnedEncodedDatum,
endian::Endian,
format::{AbstractFormat, Epoch, Format, Settings, Type, UncheckedFormat, CC},
lex::{scan::StringScanner, segment::Syntax, Punct, Token},
}
fn test_with_settings(value: f64, expected: [&str; 2], settings: &Settings) {
- let value = EncodedDatum::from(value);
+ let value = OwnedEncodedDatum::from(value);
for (expected, d) in expected.into_iter().zip([2, 1].into_iter()) {
assert_eq!(
&value
fn non_ascii_cc() {
fn test(settings: &Settings, value: f64, expected: &str) {
assert_eq!(
- &EncodedDatum::from(value)
+ &OwnedEncodedDatum::from(value)
.display(Format::new(Type::CC(CC::A), 10, 2).unwrap())
.with_settings(settings)
.to_string(),
use std::{
- borrow::{Cow},
+ borrow::Cow,
collections::HashMap,
fmt::Write as _,
fs::File,
use smallvec::SmallVec;
use crate::{
- data::{Datum, EncodedDatum, OwnedRawString, },
+ data::{Datum, OwnedEncodedDatum, OwnedRawString},
dictionary::{
Alignment, Attributes, CategoryLabels, Dictionary, Measure, MultipleResponseType,
ValueLabels, VarWidth,
}
}
-impl BinWrite for EncodedDatum {
+impl BinWrite for OwnedEncodedDatum {
type Args<'a> = ();
fn write_options<W: Write + Seek>(