use crate::type_name::ShellTypeName; use crate::value::column_path::ColumnPath; use crate::value::{serde_bigdecimal, serde_bigint}; use bigdecimal::BigDecimal; use chrono::{DateTime, Utc}; use num_bigint::BigInt; use num_traits::cast::FromPrimitive; use serde::{Deserialize, Serialize}; use std::path::PathBuf; #[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Deserialize, Serialize)] pub enum Primitive { Nothing, #[serde(with = "serde_bigint")] Int(BigInt), #[serde(with = "serde_bigdecimal")] Decimal(BigDecimal), Bytes(u64), String(String), Line(String), ColumnPath(ColumnPath), Pattern(String), Boolean(bool), Date(DateTime), Duration(u64), // Duration in seconds Path(PathBuf), #[serde(with = "serde_bytes")] Binary(Vec), // Stream markers (used as bookend markers rather than actual values) BeginningOfStream, EndOfStream, } impl From for Primitive { fn from(decimal: BigDecimal) -> Primitive { Primitive::Decimal(decimal) } } impl From for Primitive { fn from(float: f64) -> Primitive { Primitive::Decimal(BigDecimal::from_f64(float).unwrap()) } } impl ShellTypeName for Primitive { fn type_name(&self) -> &'static str { match self { Primitive::Nothing => "nothing", Primitive::Int(_) => "integer", Primitive::Decimal(_) => "decimal", Primitive::Bytes(_) => "bytes", Primitive::String(_) => "string", Primitive::Line(_) => "line", Primitive::ColumnPath(_) => "column path", Primitive::Pattern(_) => "pattern", Primitive::Boolean(_) => "boolean", Primitive::Date(_) => "date", Primitive::Duration(_) => "duration", Primitive::Path(_) => "file path", Primitive::Binary(_) => "binary", Primitive::BeginningOfStream => "marker", Primitive::EndOfStream => "marker", } } }