use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use sqlx::Postgres; use uuid::Uuid; #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] #[serde(tag = "t", content = "c")] pub enum Datum { Text(Option), Timestamp(Option>), Uuid(Option), } impl Datum { // TODO: Can something similar be achieved with a generic return type? /// Bind this as a parameter to a sqlx query. pub fn bind_onto<'a>( self, query: sqlx::query::Query<'a, Postgres, ::Arguments<'a>>, ) -> sqlx::query::Query<'a, Postgres, ::Arguments<'a>> { match self { Self::Text(value) => query.bind(value), Self::Timestamp(value) => query.bind(value), Self::Uuid(value) => query.bind(value), } } /// Transform the contained value into a serde_json::Value. pub fn inner_as_value(&self) -> serde_json::Value { let serialized = serde_json::to_value(self).unwrap(); #[derive(Deserialize)] struct Tagged { c: serde_json::Value, } let deserialized: Tagged = serde_json::from_value(serialized).unwrap(); deserialized.c } pub fn is_none(&self) -> bool { match self { Self::Text(None) | Self::Timestamp(None) | Self::Uuid(None) => true, Self::Text(_) | Self::Timestamp(_) | Self::Uuid(_) => false, } } }