use std::path::Path;
use std::io;
use super::sample_struct::Sample;
pub struct SampleReader<P, S> {
file: Option<P>,
has_header: bool,
target: Option<S>,
}
impl<P, S> SampleReader<P, S> {
pub fn new() -> Self {
Self {
file: None,
has_header: false,
target: None,
}
}
pub fn has_header(mut self, flag: bool) -> Self {
self.has_header = flag;
self
}
}
impl<P, S> SampleReader<P, S>
where P: AsRef<Path>
{
pub fn file(mut self, file: P) -> Self {
self.file = Some(file);
self
}
}
impl<P, S> SampleReader<P, S>
where S: AsRef<str>
{
pub fn target_feature(mut self, column: S) -> Self {
self.target = Some(column);
self
}
}
impl<P, S> SampleReader<P, S>
where P: AsRef<Path>,
S: AsRef<str>
{
pub fn read(self) -> io::Result<Sample> {
if self.file.is_none() {
panic!("The file name for csv/svmlight is not set");
}
let file = self.file.unwrap();
let file = file.as_ref();
let sample = if file.extension().is_some_and(|ext| ext == "csv") {
if self.target.is_none() {
panic!(
"Target (class) column is not specified. \
Use `SampleReader::target`."
);
}
let target = self.target.unwrap();
Sample::from_csv(file, self.has_header)?
.set_target(target.as_ref())
} else {
Sample::from_svmlight(file)?
};
Ok(sample)
}
}