use std::collections::BTreeMap;
use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use super::values::ValueDto;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TermState {
Complete,
Residuated,
NoWitnesses,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WitnessProofDto {
pub witness_id: String,
#[serde(default)]
pub bindings: BTreeMap<String, String>,
pub certainty: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResidualWitnessDto {
pub witness_id: String,
#[serde(default)]
pub partial_bindings: BTreeMap<String, String>,
pub trigger: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WitnessInstantiationDto {
pub witness_id: String,
#[serde(default)]
pub bindings: BTreeMap<String, String>,
pub confidence: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub explanation: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResiduationDto {
pub witness_id: String,
#[serde(default)]
pub partial_bindings: BTreeMap<String, String>,
pub trigger: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ReferencedTermSummary {
pub display_name: String,
pub sort_name: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TermDto {
pub id: String,
pub sort_id: String,
pub tenant_id: String,
pub owner_id: String,
pub features: BTreeMap<String, ValueDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sort_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
pub referenced_terms: HashMap<String, ReferencedTermSummary>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TermResponse {
pub term: TermDto,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub state: Option<TermState>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub witness_proofs: Vec<WitnessProofDto>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub residual_witnesses: Vec<ResidualWitnessDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateTermRequest {
pub sort_id: String,
pub owner_id: String,
pub features: BTreeMap<String, ValueDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateTermRequest {
pub features: BTreeMap<String, ValueDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BulkAddTermsRequest {
pub terms: Vec<CreateTermRequest>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClearTermsResponse {
pub message: String,
pub terms_cleared: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BulkAddTermsResponse {
pub term_ids: Vec<String>,
pub processing_time_ms: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ValidatedTermResponse {
pub valid: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub term: Option<TermDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub failure_reason: Option<String>,
#[serde(default)]
pub witnesses_satisfied: Vec<WitnessInstantiationDto>,
#[serde(default)]
pub witnesses_residuated: Vec<ResiduationDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ValidatedUnifyResponse {
pub success: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub unified_term: Option<TermDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub glb_sort_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub failure_reason: Option<String>,
pub duration_us: u64,
#[serde(default)]
pub witnesses_satisfied: Vec<WitnessInstantiationDto>,
#[serde(default)]
pub witnesses_residuated: Vec<ResiduationDto>,
}