use serde::{Deserialize, Serialize};
use schemars::JsonSchema;
use crate::reported::Reported;
use crate::timestamp::Timestamp;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case", deny_unknown_fields)]
pub enum PrinterState {
Operational,
Paused,
Printing,
Cancelling,
Error,
Offline,
Unknown(String),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, Default)]
#[serde(deny_unknown_fields)]
pub struct HeaterSnapshot {
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::reported::de_heater_actual_c"
)]
pub actual_c: Option<Reported<f64>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::reported::de_heater_target_c"
)]
pub target_c: Option<Reported<f64>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::reported::de_heater_offset_c"
)]
pub offset_c: Option<Reported<f64>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct PrinterSnapshot {
pub connection: PrinterState,
pub tools: Vec<HeaterSnapshot>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bed: Option<HeaterSnapshot>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub chamber: Option<HeaterSnapshot>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::reported::de_feedrate_factor"
)]
pub feedrate_factor: Option<Reported<f64>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::reported::de_flowrate_factor"
)]
pub flowrate_factor: Option<Reported<f64>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::reported::de_fan_percent"
)]
pub fan_percent: Option<Reported<f64>>,
pub observed_at: Timestamp,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct JobSnapshot {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub file_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub file_origin: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub size_bytes: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub estimated_print_time_s: Option<i64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::reported::de_completion"
)]
pub completion: Option<Reported<f64>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub print_time_s: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub print_time_left_s: Option<i64>,
pub state: PrinterState,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}