use myko::prelude::*;
use myko::TS;
use myko_macros::myko_item;
use serde::{Deserialize, Serialize};
use crate::StoredCaptureContext;
pub const FRAME_CAPTURE_CONTRACT_VERSION: &str = "0.1.0";
#[myko_item]
pub struct FrameCaptureRequest {
pub streamer_id: String,
pub capture_id: String,
pub command_id: String,
#[ts(type = "unknown")]
pub capture_context: StoredCaptureContext,
pub target: FrameCaptureTarget,
#[serde(default)]
pub force: bool,
#[serde(default)]
pub requested_at_ms: u64,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, TS)]
#[serde(rename_all = "camelCase")]
pub struct FrameCaptureTarget {
pub cluster_name: String,
#[serde(default)]
pub expected_generation: String,
}
#[derive(
Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize, TS, PartialOrd, Ord, Hash,
)]
#[serde(rename_all = "snake_case")]
pub enum FrameCapturePhase {
#[default]
Idle,
Submitted,
Arming,
Firing,
Aggregating,
Complete,
Failed,
}
impl FrameCapturePhase {
pub fn is_running(&self) -> bool {
matches!(
self,
Self::Submitted | Self::Arming | Self::Firing | Self::Aggregating
)
}
pub fn is_terminal(&self) -> bool {
matches!(self, Self::Complete | Self::Failed)
}
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, TS)]
#[serde(rename_all = "camelCase")]
pub struct FrameCaptureReceipt {
pub reference: String,
#[serde(default)]
pub label: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn running_phases_are_not_terminal() {
for phase in [
FrameCapturePhase::Submitted,
FrameCapturePhase::Arming,
FrameCapturePhase::Firing,
FrameCapturePhase::Aggregating,
] {
assert!(phase.is_running());
assert!(!phase.is_terminal());
}
for phase in [FrameCapturePhase::Complete, FrameCapturePhase::Failed] {
assert!(!phase.is_running());
assert!(phase.is_terminal());
}
assert!(!FrameCapturePhase::Idle.is_running());
assert!(!FrameCapturePhase::Idle.is_terminal());
}
}