use std::path::PathBuf;
use serde::{Deserialize, Serialize};
use crate::{Record, Span, Value};
pub const TABLE_WIDTH_PRIORITY_COLUMNS_METADATA_KEY: &str = "table_width_priority_columns";
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
pub struct PipelineMetadata {
pub data_source: DataSource,
pub path_columns: Vec<String>,
pub content_type: Option<String>,
#[serde(default)]
pub custom: Record,
}
impl PipelineMetadata {
pub fn with_data_source(self, data_source: DataSource) -> Self {
Self {
data_source,
..self
}
}
pub fn with_path_columns(self, path_columns: Vec<String>) -> Self {
Self {
path_columns,
..self
}
}
pub fn with_content_type(self, content_type: Option<String>) -> Self {
Self {
content_type,
..self
}
}
pub fn set_table_width_priority_columns<I, S>(&mut self, span: Span, columns: I)
where
I: IntoIterator<Item = S>,
S: AsRef<str>,
{
let columns: Vec<Value> = columns
.into_iter()
.map(|column| Value::string(column.as_ref(), span))
.collect();
self.custom
.retain(|key, _| key != TABLE_WIDTH_PRIORITY_COLUMNS_METADATA_KEY);
if !columns.is_empty() {
self.custom.push(
TABLE_WIDTH_PRIORITY_COLUMNS_METADATA_KEY.to_string(),
Value::list(columns, span),
);
}
}
pub fn with_table_width_priority_columns<I, S>(mut self, span: Span, columns: I) -> Self
where
I: IntoIterator<Item = S>,
S: AsRef<str>,
{
self.set_table_width_priority_columns(span, columns);
self
}
pub fn for_collect(self) -> Option<Self> {
let Self {
data_source,
path_columns,
content_type,
custom,
} = self;
let data_source = match data_source {
DataSource::FilePath(_) => DataSource::None,
other => other,
};
if matches!(data_source, DataSource::None)
&& path_columns.is_empty()
&& content_type.is_none()
&& custom.is_empty()
{
None
} else {
Some(Self {
data_source,
path_columns,
content_type,
custom,
})
}
}
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
pub enum DataSource {
HtmlThemes,
FilePath(PathBuf),
#[default]
None,
}