use crate::{DataType, Value};
use super::timed::Timed;
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct Standard {
pub columns: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time: Option<f64>,
pub types: Vec<DataType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub values: Option<Vec<Vec<Value>>>,
}
impl Timed for Standard {
fn time(&self) -> Option<f64> {
self.time
}
}
impl Standard {
#[must_use]
pub fn column(&self, index: usize) -> Option<&String> {
self.columns.get(index)
}
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn push_column(mut self, col: &str) -> Self {
self.columns.push(col.to_string());
self
}
#[must_use]
pub fn push_type(mut self, t: DataType) -> Self {
self.types.push(t);
self
}
#[must_use]
pub fn push_value(mut self, v: Value, row_index: usize) -> Self {
let values = self.values.get_or_insert(Vec::new());
if let Some(values) = values.get_mut(row_index) {
values.push(v);
}
self
}
#[must_use]
pub fn push_values(mut self, v: Vec<Value>) -> Self {
self.values.get_or_insert(Vec::new()).push(v);
self
}
#[must_use]
pub fn data_type(&self, index: usize) -> Option<DataType> {
self.types.get(index).copied()
}
#[must_use]
pub fn value(&self, row_index: usize, column_index: usize) -> Option<&Value> {
if let Some(values) = &self.values {
if let Some(row) = values.get(row_index) {
return row.get(column_index);
}
}
None
}
#[must_use]
pub fn values(&self, row_index: usize) -> Option<&Vec<Value>> {
if let Some(values) = &self.values {
return values.get(row_index);
}
None
}
}