use serde::{Deserialize, Serialize};
use super::error::LoadError;
use crate::gpu::params::ParamValue;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InstancePayload {
pub type_id: String,
#[serde(default)]
pub params: Vec<ParamValue>,
}
impl InstancePayload {
pub fn new(type_id: impl Into<String>, params: Vec<ParamValue>) -> Self {
InstancePayload {
type_id: type_id.into(),
params,
}
}
}
pub fn serialize_instance(
type_id: &str,
params: Vec<ParamValue>,
) -> Result<serde_json::Value, LoadError> {
serde_json::to_value(InstancePayload::new(type_id, params)).map_err(LoadError::from)
}
pub fn deserialize_instance(value: &serde_json::Value) -> Result<InstancePayload, LoadError> {
serde_json::from_value(value.clone()).map_err(LoadError::from)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn payload_round_trips_via_json() {
let payload =
InstancePayload::new("noise", vec![ParamValue::Float(0.5), ParamValue::Int(3)]);
let json = serde_json::to_value(&payload).unwrap();
let back: InstancePayload = serde_json::from_value(json).unwrap();
assert_eq!(back, payload);
}
#[test]
fn deserialize_missing_params_defaults_to_empty() {
let json = serde_json::json!({ "type_id": "noop" });
let payload = deserialize_instance(&json).unwrap();
assert_eq!(payload.type_id, "noop");
assert!(payload.params.is_empty());
}
#[test]
fn deserialize_malformed_returns_json_error() {
let json = serde_json::json!({ "params": [] }); let err = deserialize_instance(&json).unwrap_err();
assert!(matches!(err, LoadError::Json(_)));
}
}