use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum BinaryOperatorDto {
Add,
Subtract,
Multiply,
Divide,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", content = "value")]
pub enum FunctionValueDto {
Integer(i64),
Real(f64),
String(String),
Boolean(bool),
Uninstantiated,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ExpressionDto {
Variable {
name: String,
},
Literal {
value: FunctionValueDto,
},
BinaryOp {
op: BinaryOperatorDto,
left: Box<ExpressionDto>,
right: Box<ExpressionDto>,
},
FunctionCall {
function_name: String,
arguments: Vec<ExpressionDto>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum FunctionBodyDto {
Value {
value: FunctionValueDto,
},
Expression {
expr: ExpressionDto,
},
FunctionCall {
function_name: String,
arguments: Vec<ExpressionDto>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum FunctionGuardDto {
GreaterThan {
var: String,
value: FunctionValueDto,
},
LessThan {
var: String,
value: FunctionValueDto,
},
Equal {
var: String,
value: FunctionValueDto,
},
And {
guards: Vec<FunctionGuardDto>,
},
Or {
guards: Vec<FunctionGuardDto>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum PatternDto {
Variable { name: String },
Integer { value: i64 },
Real { value: f64 },
String { value: String },
Boolean { value: bool },
Wildcard,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FunctionClauseDto {
pub body: FunctionBodyDto,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub guard: Option<FunctionGuardDto>,
pub parameters: Vec<PatternDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegisterFunctionRequest {
pub arity: u32,
pub clauses: Vec<FunctionClauseDto>,
pub name: String,
pub tenant_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegisterFunctionResponse {
pub arity: u32,
pub clauses_count: u64,
pub function_id: String,
pub name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EvaluateFunctionRequest {
pub arguments: Vec<FunctionValueDto>,
pub function_name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_depth: Option<u32>,
pub tenant_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "result_type")]
pub enum EvaluateFunctionResponse {
Value { value: FunctionValueDto },
Suspend { reason: String },
}