use std::borrow::Cow;
use schemars::{JsonSchema, Schema, SchemaGenerator, json_schema};
use serde::de::{Error as _, Unexpected};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub enum ObicoFailureEventType {
#[serde(rename = "PrintFailure")]
PrintFailure,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub enum ObicoEventType {
PrintStarted,
PrintDone,
PrintCancelled,
PrintPaused,
PrintResumed,
FilamentChange,
HeaterCooledDown,
HeaterTargetReached,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ObicoTimestamp {
Seconds(f64),
NotReported,
}
impl Serialize for ObicoTimestamp {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match self {
Self::Seconds(seconds) => serializer.serialize_f64(*seconds),
Self::NotReported => serializer.serialize_str(""),
}
}
}
#[derive(Deserialize)]
#[serde(untagged)]
enum ObicoTimestampWire {
Seconds(f64),
Text(String),
}
impl<'de> Deserialize<'de> for ObicoTimestamp {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
match ObicoTimestampWire::deserialize(deserializer)? {
ObicoTimestampWire::Seconds(seconds) => Ok(Self::Seconds(seconds)),
ObicoTimestampWire::Text(text) if text.is_empty() => Ok(Self::NotReported),
ObicoTimestampWire::Text(text) => Err(D::Error::invalid_value(
Unexpected::Str(&text),
&"a Unix timestamp number or an empty string",
)),
}
}
}
impl JsonSchema for ObicoTimestamp {
fn schema_name() -> Cow<'static, str> {
Cow::Borrowed("ObicoTimestamp")
}
fn json_schema(_generator: &mut SchemaGenerator) -> Schema {
json_schema!({
"title": "ObicoTimestamp",
"description": "A Unix timestamp number, or the empty string the producer sends \
when it has no instant to send.",
"anyOf": [
{ "type": "number" },
{ "type": "string", "maxLength": 0 }
]
})
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ObicoPrinterInfo {
pub id: i64,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ObicoPrintInfo {
pub id: i64,
pub filename: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at: Option<ObicoTimestamp>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ended_at: Option<ObicoTimestamp>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ObicoFailureEvent {
#[serde(rename = "type")]
pub event_type: ObicoFailureEventType,
pub is_warning: bool,
pub print_paused: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ObicoNotificationEvent {
#[serde(rename = "type")]
pub event_type: ObicoEventType,
pub is_warning: bool,
pub print_paused: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ObicoFailureAlert {
pub event: ObicoFailureEvent,
pub printer: ObicoPrinterInfo,
pub print: ObicoPrintInfo,
pub img_url: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct ObicoPrinterNotification {
pub event: ObicoNotificationEvent,
pub printer: ObicoPrinterInfo,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub print: Option<ObicoPrintInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub img_url: Option<String>,
}