use std::fs::File;
use std::io::BufReader;
use std::path::Path;
use crate::config::ReadOptions;
use crate::dataset::Dataset;
use crate::error::{Error, Result};
use crate::write_plan::XptWriterBuilder;
use crate::xpt::v5::read::{XptInfo, XptReader as V5Reader};
pub struct Xpt;
impl Xpt {
#[must_use = "this returns a Result that should be handled"]
pub fn read(path: impl AsRef<Path>) -> Result<Dataset> {
Self::reader(path)?.read()
}
#[must_use = "this returns a Result that should be handled"]
pub fn reader(path: impl AsRef<Path>) -> Result<XptReaderBuilder> {
let file = File::open(path.as_ref()).map_err(Error::Io)?;
let reader = V5Reader::new(BufReader::new(file))?;
Ok(XptReaderBuilder {
reader,
options: ReadOptions::default(),
})
}
#[must_use]
pub fn writer(dataset: Dataset) -> XptWriterBuilder {
XptWriterBuilder::new(dataset)
}
#[must_use = "this returns a Result that should be handled"]
pub fn inspect(path: impl AsRef<Path>) -> Result<XptInfo> {
let file = File::open(path.as_ref()).map_err(Error::Io)?;
let reader = V5Reader::new(BufReader::new(file))?;
Ok(reader.file_info().clone())
}
}
pub struct XptReaderBuilder {
reader: V5Reader<BufReader<File>>,
options: ReadOptions,
}
impl std::fmt::Debug for XptReaderBuilder {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("XptReaderBuilder")
.field("options", &self.options)
.finish_non_exhaustive()
}
}
impl XptReaderBuilder {
#[allow(dead_code)]
pub(crate) fn options(&mut self, options: ReadOptions) -> &mut Self {
self.options = options;
self
}
#[must_use]
pub fn info(&self) -> &XptInfo {
self.reader.file_info()
}
#[must_use = "this returns a Result that should be handled"]
pub fn read(mut self) -> Result<Dataset> {
let first_member = self
.reader
.file_info()
.members
.first()
.ok_or_else(|| Error::corrupt("XPT file contains no members"))?
.name
.clone();
self.reader.read_member(&first_member, &self.options)
}
#[must_use = "this returns a Result that should be handled"]
pub fn read_member(mut self, name: &str) -> Result<Dataset> {
self.reader.read_member(name, &self.options)
}
#[must_use = "this returns a Result that should be handled"]
pub fn read_all(mut self) -> Result<Vec<Dataset>> {
self.reader.read_all(&self.options)
}
}