use crate::{serde::bytecode, ContentAddress};
pub use encode::{PredicateDecodeError, PredicateEncodeError};
use serde::{Deserialize, Serialize};
#[cfg(feature = "schema")]
use schemars::JsonSchema;
pub mod encode;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
pub struct Node {
pub edge_start: Edge,
pub program_address: ContentAddress,
}
pub type Edge = u16;
#[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
pub struct Predicate {
pub nodes: Vec<Node>,
pub edges: Vec<Edge>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub struct Program(
#[serde(
serialize_with = "bytecode::serialize",
deserialize_with = "bytecode::deserialize"
)]
pub Vec<u8>,
);
impl Predicate {
pub const MAX_NODES: u16 = 1000;
pub const MAX_EDGES: u16 = 1000;
pub fn encode(&self) -> Result<impl Iterator<Item = u8> + '_, PredicateEncodeError> {
encode::encode_predicate(self)
}
pub fn encoded_size(&self) -> usize {
encode::predicate_encoded_size(self)
}
pub fn decode(bytes: &[u8]) -> Result<Self, PredicateDecodeError> {
encode::decode_predicate(bytes)
}
pub fn node_edges(&self, node_ix: usize) -> Option<&[Edge]> {
let node = self.nodes.get(node_ix)?;
if node.edge_start == Edge::MAX {
return Some(&[]);
}
let e_start = usize::from(node.edge_start);
let next_node_ix = node_ix.saturating_add(1);
let e_end = match self.nodes.get(next_node_ix) {
Some(next) if next.edge_start != Edge::MAX => usize::from(next.edge_start),
Some(_) | None => self.edges.len(),
};
let edges = self.edges.get(e_start..e_end)?;
Some(edges)
}
}
impl Program {
pub const MAX_SIZE: u16 = 10_000;
}