tabiew 0.16.0

A lightweight TUI application to view and query tabular data files, such as CSV, TSV, and parquet.
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)),
        }
    }
}