mod bitmask;
mod conversion;
mod graph;
mod path;
pub use conversion::exploded_reachability_to_statement_mask;
pub use graph::{try_prepare_witness_graph, PreparedWitnessGraph};
#[cfg(any(test, feature = "legacy-infallible"))]
pub use graph::prepare_witness_graph;
pub use path::{
extract_path, extract_path_prepared, extract_paths_prepared, extract_paths_prepared_into,
PathExtractionRequest, PreparedWitnessBatchStats,
};
#[cfg(test)]
use vyre_primitives::predicate::edge_kind;
#[cfg(test)]
const MAX_PATH_DEPTH: usize = path::MAX_PATH_DEPTH;
#[cfg(test)]
fn bit_is_set(bitmask: &[u32], i: u32) -> bool {
bitmask::try_bit_is_set(bitmask, i).expect("test witness bitmask query should be addressable")
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PathSeed {
pub source_file: String,
pub source_node: u32,
pub sink_file: String,
pub sink_node: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ExtractedStatement {
pub adapter: String,
pub description: String,
pub file: String,
pub node_id: u32,
pub byte_start: u32,
pub byte_end: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ExtractedPath {
pub statements: Vec<ExtractedStatement>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PrepareWitnessGraphError {
InvalidOffsetCount {
offsets: usize,
expected: usize,
},
OffsetCountOverflow {
nodes: usize,
},
EdgeArrayLengthMismatch {
targets: usize,
kinds: usize,
},
EdgeCountOverflow {
edges: usize,
},
NonZeroInitialOffset {
first: u32,
},
NonMonotonicOffsets {
source: usize,
start: usize,
end: usize,
},
OffsetExceedsEdgeCount {
offset_index: usize,
offset: usize,
edges: usize,
},
ReverseEdgeCountOverflow {
node: usize,
},
TerminalOffsetMismatch {
terminal: usize,
edges: usize,
},
TargetOutOfBounds {
edge_index: usize,
target: u32,
node_count: u32,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PathError {
NoPath,
DepthExceeded {
partial_chain: Vec<u32>,
},
NodeOutOfBounds {
node: u32,
node_count: u32,
},
MalformedGraph {
reason: PrepareWitnessGraphError,
fix: String,
},
ResourceExhausted {
field: String,
fix: String,
},
}
impl PartialEq<PrepareWitnessGraphError> for PathError {
fn eq(&self, other: &PrepareWitnessGraphError) -> bool {
matches!(self, Self::MalformedGraph { reason, .. } if reason == other)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ExplodedDecodeError {
InvalidShape,
BlockOutOfBounds {
proc_id: u32,
block_id: u32,
slot: u32,
slot_count: u32,
},
StatementOutOfBounds {
statement: u32,
statement_count: u32,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NodeAttr {
pub byte_start: u32,
pub byte_end: u32,
pub file_idx: u32,
}
#[cfg(test)]
#[path = "reachability_witness_graph_validation_tests.rs"]
mod reachability_witness_graph_validation_tests;
#[cfg(test)]
#[path = "reachability_witness_tests.rs"]
mod reachability_witness_tests;