use serde::{Deserialize, Serialize};
use crate::WorkerTransport;
#[derive(Serialize, Deserialize, ts_rs::TS, Clone, Debug, PartialEq, Eq)]
pub struct WorkerAttribution {
pub identity: String,
pub task_queue: String,
pub node: Option<String>,
pub deployment: Option<String>,
pub instance_id: Option<String>,
#[serde(flatten)]
#[ts(flatten)]
pub transport: WorkerTransport,
}
#[cfg(test)]
mod tests {
use super::WorkerAttribution;
use crate::WorkerTransport;
fn attribution() -> WorkerAttribution {
WorkerAttribution {
identity: String::from("worker-a@host-1"),
task_queue: String::from("billing"),
node: Some(String::from("n1")),
deployment: Some(String::from("billing-workers")),
instance_id: Some(String::from("i-42")),
transport: WorkerTransport::Grpc,
}
}
#[test]
fn attribution_round_trips_through_json() -> Result<(), serde_json::Error> {
let value = attribution();
let encoded = serde_json::to_string(&value)?;
let decoded: WorkerAttribution = serde_json::from_str(&encoded)?;
assert_eq!(decoded, value);
Ok(())
}
#[test]
fn transport_is_one_flat_key_spelled_like_the_cluster_stream() -> Result<(), serde_json::Error>
{
for transport in [WorkerTransport::Grpc, WorkerTransport::Liminal] {
let encoded = serde_json::to_value(WorkerAttribution {
transport,
..attribution()
})?;
assert_eq!(
encoded["transport"],
serde_json::to_value(transport)?["transport"]
);
assert!(encoded.get("Grpc").is_none() && encoded.get("Liminal").is_none());
}
Ok(())
}
#[test]
fn absent_optional_names_encode_as_null_and_decode_back() -> Result<(), serde_json::Error> {
let value = WorkerAttribution {
node: None,
deployment: None,
instance_id: None,
transport: WorkerTransport::Liminal,
..attribution()
};
let encoded = serde_json::to_value(&value)?;
assert!(encoded["node"].is_null());
assert!(encoded["deployment"].is_null());
assert!(encoded["instance_id"].is_null());
assert_eq!(encoded["transport"], "Liminal");
let decoded: WorkerAttribution = serde_json::from_value(encoded)?;
assert_eq!(decoded, value);
Ok(())
}
}