use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum ResolveTargetType {
Entity,
Organization,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ResolveInput {
pub name: String,
pub target_type: ResolveTargetType,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub state: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub city: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub context: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ResolveCandidate {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub identifier: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub match_tier: Option<String>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ResolveResult {
#[serde(default)]
pub count: u32,
#[serde(default)]
pub candidates: Vec<ResolveCandidate>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn resolve_result_captures_unknown_fields_via_extra() {
let body = json!({
"count": 1,
"candidates": [{
"identifier": "ABC",
"display_name": "ACME",
"match_tier": "high",
"future_score": 0.92
}],
"future_meta": {"version": 2}
});
let r: ResolveResult = serde_json::from_value(body).expect("decode");
assert_eq!(r.count, 1);
assert!(r.extra.contains_key("future_meta"));
let candidate = &r.candidates[0];
assert_eq!(candidate.identifier.as_deref(), Some("ABC"));
assert!(candidate.extra.contains_key("future_score"));
}
#[test]
fn resolve_target_type_round_trips() {
let v = serde_json::to_value(ResolveTargetType::Entity).unwrap();
assert_eq!(v, json!("entity"));
let back: ResolveTargetType = serde_json::from_value(json!("organization")).unwrap();
assert_eq!(back, ResolveTargetType::Organization);
}
}