use essential_builder_db as builder_db;
use essential_check::solution::PredicatesError;
use essential_node as node;
use essential_node_db as node_db;
use essential_types::{predicate::PredicateDecodeError, ContentAddress, Key};
use thiserror::Error;
#[derive(Debug, Error)]
pub enum BuildBlockError {
#[error("A builder DB query error occurred: {0}")]
BuilderQuery(#[from] builder_db::error::AcquireThenQueryError),
#[error("A builder DB rusqlite error occurred: {0}")]
BuilderRusqlite(#[from] builder_db::error::AcquireThenRusqliteError),
#[error("A node DB rusqlite error occurred: {0}")]
NodeRusqlite(#[from] node::db::pool::AcquireThenRusqliteError),
#[error("Failed to check and apply solution sets: {0}")]
CheckSets(#[from] CheckSetsError),
#[error("System time produced non-monotonic timestamp")]
TimestampNotMonotonic,
#[error("System timestamp is out of range of `Word`")]
TimestampOutOfRange,
#[error("Failed to retrieve the last block header")]
LastBlockHeader(#[from] node::db::pool::AcquireThenError<LastBlockHeaderError>),
#[error("The next block number would be out of `u64` range")]
BlockNumberOutOfRange,
}
#[derive(Debug, Error)]
pub enum LastBlockHeaderError {
#[error("A rusqlite error occurred: {0}")]
Rusqlite(#[from] rusqlite::Error),
#[error("A node DB query error occurred: {0}")]
Query(#[from] node_db::QueryError),
#[error("The node DB contained no number for the last finalized block")]
NoNumberForLastFinalizedBlock,
#[error("The node DB contained no timestamp for the last finalized block")]
NoTimestampForLastFinalizedBlock,
}
#[derive(Debug, Error)]
pub enum CheckSetsError {
#[error("an error occurred while attempting to apply a set: {0}")]
CheckSolution(#[from] CheckSetError),
}
#[derive(Debug, Error)]
pub enum CheckSetError {
#[error("a rusqlite error occurred: {0}")]
Rusqlite(#[from] rusqlite::Error),
#[error("a node DB query failed: {0}")]
NodeQuery(#[from] node::db::pool::AcquireThenQueryError),
}
#[derive(Debug, Error)]
pub enum SetPredicatesError {
#[error("an error occurred while querying for a predicate from the node DB: {0}")]
QueryPredicate(#[from] QueryPredicateError),
#[error("the node DB is missing a required predicate ({0})")]
PredicateDoesNotExist(ContentAddress),
}
#[derive(Debug, Error)]
pub enum PredicateProgramsError {
#[error("an error occurred while querying for a program from the node DB: {0}")]
QueryProgram(#[from] QueryProgramError),
#[error("the node DB is missing a required program ({0})")]
ProgramDoesNotExist(ContentAddress),
}
#[derive(Debug, Error)]
pub enum InvalidSet {
#[error("Solution set specified a predicate to solve that does not exist")]
PredicateDoesNotExist(ContentAddress),
#[error("Solution set contains a predicate that specified a program that does not exist")]
ProgramDoesNotExist(ContentAddress),
#[error(
"Solution set specified a predicate that was invalid when reading from contract registry state"
)]
PredicateInvalid,
#[error(
"Solution set contains a predicate that specified a program that was invalid when reading from program registry state"
)]
ProgramInvalid,
#[error("Validation of the solution set predicates failed: {0}")]
Predicates(PredicatesError<StateReadError>),
}
#[derive(Debug, Error)]
pub enum StateReadError {
#[error("a state query failed: {0}")]
Query(#[from] node::db::pool::AcquireThenQueryError),
#[error("No entry exists for the given key {0:?}")]
NoEntry(Key),
#[error("A key would be out of range: `key` {key:?}, `num_values` {num_values}")]
OutOfRange { key: Key, num_values: usize },
}
#[derive(Debug, Error)]
pub enum QueryPredicateError {
#[error("failed to query the node DB: {0}")]
ConnPoolQuery(#[from] node::db::pool::AcquireThenQueryError),
#[error("the queried predicate is missing the word that encodes its length")]
MissingLenBytes,
#[error("the queried predicate length was invalid")]
InvalidLenBytes,
#[error("failed to decode the queried predicate: {0}")]
Decode(#[from] PredicateDecodeError),
}
#[derive(Debug, Error)]
pub enum QueryProgramError {
#[error("failed to query the node DB: {0}")]
ConnPoolQuery(#[from] node::db::pool::AcquireThenQueryError),
#[error("the queried program is missing the word that encodes its length")]
MissingLenBytes,
#[error("the queried program length was invalid")]
InvalidLenBytes,
}