use anyhow::anyhow;
use std::{borrow::Cow, path::PathBuf, str::FromStr};
use url::Url;
mod arrow;
mod avro;
mod csv;
mod excel;
mod fwf;
mod html;
mod json;
mod json_line;
mod logfmt;
mod markdown;
mod parquet;
mod source;
mod sqlite;
mod traits;
pub use arrow::ArrowIpcToDataFrame;
pub use avro::AvroToDataFrame;
pub use csv::CsvToDataFrame;
pub use excel::ExcelToDataFrames;
pub use fwf::FwfToDataFrame;
pub use html::HtmlToDataFrame;
pub use json::JsonToDataFrame;
pub use json_line::JsonLineToDataFrame;
pub use logfmt::LogfmtToDataFrame;
pub use markdown::MarkdownToDataFrame;
pub use parquet::ParquetToDataFrame;
pub use source::ReaderSource;
pub use sqlite::SqliteToDataFrames;
pub use traits::{DataFrameReader, NamedFrames};
#[derive(Debug, Clone, Hash)]
pub enum DataSource {
Stdin,
File(PathBuf),
Url(Url),
}
impl DataSource {
pub fn display_path(&self) -> Cow<'_, str> {
match self {
DataSource::Stdin => Cow::Borrowed("Stdin"),
DataSource::File(path_buf) => {
path_buf.file_name().unwrap_or_default().to_string_lossy()
}
DataSource::Url(url) => url.as_str().into(),
}
}
}
impl FromStr for DataSource {
type Err = anyhow::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if s == "-" {
return Ok(DataSource::Stdin);
}
let path = PathBuf::from(s);
if path.exists() {
return Ok(DataSource::File(path));
}
match Url::parse(s) {
Ok(url) => match url.scheme() {
"http" | "https" => Ok(DataSource::Url(url)),
_ => Err(anyhow!("Unsupported url scheme: {}", url.scheme())),
},
Err(_) => Ok(DataSource::File(path)),
}
}
}