use myko::prelude::*;
use myko::TS;
use myko_macros::myko_item;
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, TS)]
#[serde(rename_all = "snake_case")]
pub enum DlssReconstruction {
SuperResolution,
RayReconstruction,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, TS)]
#[serde(rename_all = "snake_case")]
pub enum DlssQuality {
Unmanaged,
Auto,
UltraPerformance,
Performance,
Balanced,
Quality,
UltraQuality,
Dlaa,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TS)]
#[serde(tag = "state", rename_all = "snake_case", deny_unknown_fields)]
pub enum DlssSettings {
Disabled,
Enabled {
reconstruction: DlssReconstruction,
quality: DlssQuality,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, TS)]
#[serde(rename_all = "camelCase")]
pub struct PrevisProcessTarget {
pub cluster_name: String,
pub deployment_generation: u64,
pub host: String,
pub process_id: u32,
#[serde(default)]
pub process_started_at: Option<String>,
pub process_generation: u64,
}
#[myko_item]
pub struct PrevisDlssRequest {
pub streamer_id: String,
pub request_id: String,
pub target: PrevisProcessTarget,
pub settings: DlssSettings,
#[serde(default)]
pub requested_at_ms: u64,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn process_target_keeps_the_process_start_fence() {
let target: PrevisProcessTarget = serde_json::from_value(serde_json::json!({
"clusterName": "12of12",
"deploymentGeneration": 42,
"host": "render-13",
"processId": 4100,
"processGeneration": 42,
"processStartedAt": "2026-09-05T02:59:06+00:00"
}))
.unwrap();
assert_eq!(
target.process_started_at.as_deref(),
Some("2026-09-05T02:59:06+00:00")
);
}
#[test]
fn legacy_process_target_replays_without_the_process_start_fence() {
let target: PrevisProcessTarget = serde_json::from_value(serde_json::json!({
"clusterName": "12of12",
"deploymentGeneration": 42,
"host": "render-13",
"processId": 4100,
"processGeneration": 42
}))
.unwrap();
assert_eq!(target.process_started_at, None);
}
#[test]
fn settings_round_trip_without_optional_field_states() {
for settings in [
DlssSettings::Disabled,
DlssSettings::Enabled {
reconstruction: DlssReconstruction::RayReconstruction,
quality: DlssQuality::Quality,
},
] {
let encoded = serde_json::to_value(&settings).unwrap();
assert_eq!(
serde_json::from_value::<DlssSettings>(encoded).unwrap(),
settings
);
}
assert_eq!(
serde_json::to_value(DlssSettings::Disabled).unwrap(),
serde_json::json!({ "state": "disabled" })
);
}
}