use std::cell::OnceCell;
use crate::sanitizing::SanitizedIdentifier;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum ColumnType {
Raw,
Blob,
Line,
}
#[derive(Debug)]
pub struct Column {
name: String,
sanitized_name: OnceCell<SanitizedIdentifier>,
column_type: ColumnType,
value: Option<String>,
json: bool,
}
impl Column {
pub fn raw_column(key: impl ToString, value: impl ToString) -> Column {
Column {
name: key.to_string(),
sanitized_name: OnceCell::new(),
column_type: ColumnType::Raw,
value: Some(value.to_string()),
json: false,
}
}
pub fn blob_column(key: impl ToString) -> Column {
Column {
name: key.to_string(),
sanitized_name: OnceCell::new(),
column_type: ColumnType::Blob,
value: None,
json: false,
}
}
pub fn line_column(key: impl ToString) -> Column {
Column {
name: key.to_string(),
sanitized_name: OnceCell::new(),
column_type: ColumnType::Line,
value: None,
json: false,
}
}
pub fn set_json(mut self, json: bool) -> Self {
self.json = json;
self
}
pub fn raw_value(&self) -> &str {
self.value
.as_ref()
.expect("raw_value called on non raw value")
}
pub fn value_or_line<'a>(&'a self, line: &'a str) -> &'a str {
self.value.as_ref().map(|v| v.as_str()).unwrap_or(line)
}
pub fn value(&self) -> Option<&str> {
self.value.as_ref().map(|v| v.as_str())
}
pub fn sanitized_name(&self) -> &SanitizedIdentifier {
&self
.sanitized_name
.get_or_init(|| SanitizedIdentifier::new(&self.name))
}
pub fn name(&self) -> &str {
&self.name
}
pub fn column_type(&self) -> ColumnType {
self.column_type
}
pub fn is_json(&self) -> bool {
self.json
}
}