diff --git a/src/main.rs b/src/main.rs index 6a0283f..ed197f9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ mod args; mod config; mod id; +mod primitive; mod server; mod shared; mod somehow; diff --git a/src/primitive.rs b/src/primitive.rs new file mode 100644 index 0000000..5030cdf --- /dev/null +++ b/src/primitive.rs @@ -0,0 +1,49 @@ +//! Primitive serializable and deserializable types. + +use serde::de; +use serde_repr::{Deserialize_repr, Serialize_repr}; +use time::{format_description::well_known::Rfc3339, OffsetDateTime}; + +/// The source of a line of output. +#[derive(Clone, Serialize_repr, Deserialize_repr, sqlx::Type)] +#[repr(u8)] +pub enum Source { + Internal = 0, + Stdout = 1, + Stderr = 2, +} + +/// The direction a measured value improves in. +#[derive(Clone, Serialize_repr, Deserialize_repr, sqlx::Type)] +#[repr(i8)] +pub enum Direction { + LessIsBetter = -1, + Neutral = 0, + MoreIsBetter = 1, +} + +/// A time stamp, usually formatted using RFC3339. +#[derive(Clone, Copy, sqlx::Type)] +#[sqlx(transparent)] +pub struct Timestamp(pub OffsetDateTime); + +impl serde::Serialize for Timestamp { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + self.0.format(&Rfc3339).unwrap().serialize(serializer) + } +} + +impl<'de> serde::Deserialize<'de> for Timestamp { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let input: &str = serde::Deserialize::deserialize(deserializer)?; + OffsetDateTime::parse(input, &Rfc3339) + .map_err(de::Error::custom) + .map(Self) + } +} diff --git a/src/server/workers.rs b/src/server/workers.rs index 432c739..5c7d08d 100644 --- a/src/server/workers.rs +++ b/src/server/workers.rs @@ -5,7 +5,8 @@ use time::OffsetDateTime; use crate::{ config::ServerConfig, id, - shared::{BenchMethod, Rfc3339Time, Run, UnfinishedRun, WorkerStatus}, + primitive::Timestamp, + shared::{BenchMethod, Run, UnfinishedRun, WorkerStatus}, }; #[derive(Clone)] @@ -84,7 +85,7 @@ impl Workers { id, hash, bench_method, - start: Rfc3339Time(OffsetDateTime::now_utc()), + start: Timestamp(OffsetDateTime::now_utc()), }; // Reserve work so other workers don't choose it diff --git a/src/shared.rs b/src/shared.rs index 3300b41..bbc6420 100644 --- a/src/shared.rs +++ b/src/shared.rs @@ -2,55 +2,14 @@ use std::{collections::HashMap, fmt}; -use serde::{de, Deserialize, Serialize}; -use serde_repr::{Deserialize_repr, Serialize_repr}; -use time::{format_description::well_known::Rfc3339, OffsetDateTime}; +use serde::{Deserialize, Serialize}; + +use crate::primitive::{Source, Timestamp}; fn is_false(b: &bool) -> bool { !b } -#[derive(Clone, Copy)] -pub struct Rfc3339Time(pub OffsetDateTime); - -impl serde::Serialize for Rfc3339Time { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - self.0.format(&Rfc3339).unwrap().serialize(serializer) - } -} - -impl<'de> serde::Deserialize<'de> for Rfc3339Time { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - let input: &str = serde::Deserialize::deserialize(deserializer)?; - OffsetDateTime::parse(input, &Rfc3339) - .map_err(de::Error::custom) - .map(Self) - } -} - -#[derive(Clone, Serialize_repr, Deserialize_repr, sqlx::Type)] -#[repr(u8)] -pub enum Source { - // TODO Internal = 0 ? - // Stdin would be fd 0 - Stdout = 1, - Stderr = 2, -} - -#[derive(Clone, Serialize_repr, Deserialize_repr, sqlx::Type)] -#[repr(i8)] -pub enum Direction { - LessIsBetter = -1, - Neutral = 0, - MoreIsBetter = 1, -} - #[derive(Clone, Serialize, Deserialize)] pub struct Measurement { pub value: f64, @@ -81,7 +40,7 @@ pub struct Run { pub id: String, pub hash: String, pub bench_method: BenchMethod, - pub start: Rfc3339Time, + pub start: Timestamp, } #[derive(Clone, Serialize, Deserialize)] @@ -89,7 +48,7 @@ pub struct UnfinishedRun { pub id: String, pub hash: String, pub bench_method: String, - pub start: Rfc3339Time, + pub start: Timestamp, #[serde(default)] pub last_output: Vec<(Source, String)>, @@ -100,13 +59,13 @@ pub struct FinishedRun { pub id: String, pub hash: String, pub bench_method: String, - pub start: Rfc3339Time, + pub start: Timestamp, /// Override the server's end time. /// /// Should not be used in normal operation, but can be used when importing /// completed runs from other sources. - pub end: Option, + pub end: Option, #[serde(default)] pub exit_code: i32, diff --git a/src/worker/run.rs b/src/worker/run.rs index 5f9916a..ea90372 100644 --- a/src/worker/run.rs +++ b/src/worker/run.rs @@ -10,7 +10,8 @@ use tokio::sync::Notify; use crate::{ config::WorkerServerConfig, - shared::{BenchMethod, FinishedRun, Measurement, Run, Source, UnfinishedRun}, + primitive::Source, + shared::{BenchMethod, FinishedRun, Measurement, Run, UnfinishedRun}, }; use super::server::Server;