use serde::{Deserialize, Serialize};
use crate::{Key, PredicateAddress, Value, Word};
pub mod decode;
pub mod encode;
#[cfg(feature = "schema")]
use schemars::JsonSchema;
pub type SolutionIndex = u16;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
pub struct SolutionSet {
#[serde(alias = "data")]
pub solutions: Vec<Solution>,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
pub struct Solution {
pub predicate_to_solve: PredicateAddress,
#[serde(alias = "decision_variables")]
pub predicate_data: Vec<Value>,
pub state_mutations: Vec<Mutation>,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
pub struct Mutation {
pub key: Key,
pub value: Value,
}
impl SolutionSet {
pub fn state_mutations_len(&self) -> usize {
self.solutions.iter().map(|d| d.state_mutations.len()).sum()
}
}
impl Mutation {
pub fn encode_size(&self) -> usize {
encode::encode_mutation_size(self)
}
pub fn encode(&self) -> impl Iterator<Item = Word> + use<'_> {
encode::encode_mutation(self)
}
pub fn decode_mutation(bytes: &[Word]) -> Result<Self, decode::MutationDecodeError> {
decode::decode_mutation(bytes)
}
}