use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", content = "value")]
pub enum OsfFeatureValueDto {
String(String),
Integer(i64),
Real(f64),
Boolean(bool),
Reference(String),
List(Vec<OsfFeatureValueDto>),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum OsfFeatureTargetDto {
TypedValue(OsfFeatureValueDto),
Variable(String),
}
impl OsfFeatureTargetDto {
pub fn var(name: impl Into<String>) -> Self {
Self::Variable(name.into())
}
pub fn string(s: impl Into<String>) -> Self {
Self::TypedValue(OsfFeatureValueDto::String(s.into()))
}
pub fn integer(i: i64) -> Self {
Self::TypedValue(OsfFeatureValueDto::Integer(i))
}
pub fn real(r: f64) -> Self {
Self::TypedValue(OsfFeatureValueDto::Real(r))
}
pub fn boolean(b: bool) -> Self {
Self::TypedValue(OsfFeatureValueDto::Boolean(b))
}
pub fn term_ref(uuid: impl Into<String>) -> Self {
Self::TypedValue(OsfFeatureValueDto::Reference(uuid.into()))
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum OsfConstraintDto {
Sort {
var: String,
sort_id: String,
},
Equality { var1: String, var2: String },
Feature {
var: String,
feature: String,
value: OsfFeatureTargetDto,
},
Entailment {
antecedent: Box<OsfClauseDto>,
consequent: Box<OsfClauseDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
confidence: Option<f64>,
},
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct OsfClauseDto {
#[serde(default)]
pub constraints: Vec<OsfConstraintDto>,
}
impl OsfClauseDto {
pub fn new<I: IntoIterator<Item = OsfConstraintDto>>(constraints: I) -> Self {
Self {
constraints: constraints.into_iter().collect(),
}
}
}