use serde::{Deserialize, Serialize};
use wist_contracts::API_VERSION_V1;
use super::{DiscoveryAspectPolicy, DiscoveryAspectPolicySet};
pub const API_VERSION: &str = API_VERSION_V1;
pub const POLL_DISCOVERY_POLICIES_KIND: &str = "poll_discovery_policies";
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct PollDiscoveryPolicies {
pub api_version: String,
pub kind: String,
pub agent_id: String,
pub instance_id: String,
pub requested_at: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct DiscoveryPoliciesReturned {
pub policy_version: i64,
pub published_at: String,
pub policies: Vec<DiscoveryAspectPolicy>,
pub returned_at: String,
}
impl DiscoveryPoliciesReturned {
pub fn from_set(set: &DiscoveryAspectPolicySet, returned_at: String) -> Self {
Self {
policy_version: set.policy_version,
published_at: set.published_at.clone(),
policies: set.policies.clone(),
returned_at,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn discovery_policies_returned_from_set_copies_the_versioned_table() {
let set = DiscoveryAspectPolicySet::new(
4,
"2026-09-27T00:00:00Z".to_string(),
vec![DiscoveryAspectPolicy {
aspect: "host".to_string(),
default_interval_seconds: 900,
min_interval_seconds: 60,
max_interval_seconds: 3600,
baseline: true,
enabled_by_default: true,
platforms: vec!["macos".to_string(), "linux".to_string()],
yields: "os/arch".to_string(),
}],
);
let returned =
DiscoveryPoliciesReturned::from_set(&set, "2026-09-27T00:00:01Z".to_string());
assert_eq!(returned.policy_version, 4);
assert_eq!(returned.policies, set.policies);
assert_eq!(returned.returned_at, "2026-09-27T00:00:01Z");
let json = serde_json::to_string(&returned).expect("encode");
let back: DiscoveryPoliciesReturned = serde_json::from_str(&json).expect("decode");
assert_eq!(back, returned);
}
#[test]
fn poll_discovery_policies_round_trips_and_rejects_unknown_fields() {
let poll = PollDiscoveryPolicies {
api_version: API_VERSION_V1.to_string(),
kind: POLL_DISCOVERY_POLICIES_KIND.to_string(),
agent_id: "agent-1".to_string(),
instance_id: "inst-1".to_string(),
requested_at: "2026-09-27T00:00:00Z".to_string(),
};
let json = serde_json::to_string(&poll).expect("encode");
let back: PollDiscoveryPolicies = serde_json::from_str(&json).expect("decode");
assert_eq!(back, poll);
let mutated = json.replacen('{', "{\"extra\":1,", 1);
assert!(serde_json::from_str::<PollDiscoveryPolicies>(&mutated).is_err());
}
}