* support wildcard predicates in frontend * suport wildcard predicate in podlang * add validation test * test full flow and apply some fixes * fix clippy * fix merge issues * use desugared predicate * Fix parsing of intro statement templates inside custom predicates * Tidy up comments * lang: handle wildcard predicate * add unreachable message --------- Co-authored-by: Rob Knight <mail@robknight.org.uk>
99 lines
2.9 KiB
Rust
99 lines
2.9 KiB
Rust
use std::{backtrace::Backtrace, fmt::Debug};
|
|
|
|
use crate::middleware::BackendError;
|
|
|
|
pub type Result<T, E = Error> = core::result::Result<T, E>;
|
|
|
|
#[derive(thiserror::Error, Debug)]
|
|
pub enum InnerError {
|
|
#[error("{0} {1} is over the limit {2}")]
|
|
MaxLength(String, usize, usize),
|
|
#[error("invalid arguments to {0} operation")]
|
|
OpInvalidArgs(String),
|
|
#[error("Podlang parse error: {0}")]
|
|
PodlangParse(String),
|
|
#[error("POD Request validation error: {0}")]
|
|
PodRequestValidation(String),
|
|
#[error("Too many input PODs provided: {0} were provided, but the maximum is {1}")]
|
|
TooManyInputPods(usize, usize),
|
|
#[error("Too many public statements provided: {0} were provided, but the maximum is {1}")]
|
|
TooManyPublicStatements(usize, usize),
|
|
#[error("Too many statements provided: {0} were provided, but the maximum is {1}")]
|
|
TooManyStatements(usize, usize),
|
|
// Other
|
|
#[error("{0}")]
|
|
Custom(String),
|
|
}
|
|
|
|
#[derive(thiserror::Error)]
|
|
pub enum Error {
|
|
#[error("Inner: {inner}\n{backtrace}")]
|
|
Inner {
|
|
inner: Box<InnerError>,
|
|
backtrace: Box<Backtrace>,
|
|
},
|
|
#[error(transparent)]
|
|
Backend(#[from] BackendError),
|
|
#[error(transparent)]
|
|
Middleware(#[from] crate::middleware::Error),
|
|
}
|
|
|
|
impl From<std::convert::Infallible> for Error {
|
|
fn from(value: std::convert::Infallible) -> Self {
|
|
match value {}
|
|
}
|
|
}
|
|
|
|
impl From<crate::lang::LangError> for Error {
|
|
fn from(value: crate::lang::LangError) -> Self {
|
|
Error::podlang_parse(value)
|
|
}
|
|
}
|
|
|
|
impl From<crate::lang::MultiOperationError> for Error {
|
|
fn from(value: crate::lang::MultiOperationError) -> Self {
|
|
Error::custom(value.to_string())
|
|
}
|
|
}
|
|
|
|
impl Debug for Error {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
std::fmt::Display::fmt(self, f)
|
|
}
|
|
}
|
|
|
|
macro_rules! new {
|
|
($inner:expr) => {
|
|
Error::Inner {
|
|
inner: Box::new($inner),
|
|
backtrace: Box::new(Backtrace::capture()),
|
|
}
|
|
};
|
|
}
|
|
use InnerError::*;
|
|
impl Error {
|
|
pub(crate) fn custom(s: impl Into<String>) -> Self {
|
|
new!(Custom(s.into()))
|
|
}
|
|
pub(crate) fn op_invalid_args(s: String) -> Self {
|
|
new!(OpInvalidArgs(s))
|
|
}
|
|
pub(crate) fn max_length(obj: String, found: usize, expect: usize) -> Self {
|
|
new!(MaxLength(obj, found, expect))
|
|
}
|
|
pub(crate) fn podlang_parse(e: crate::lang::LangError) -> Self {
|
|
new!(PodlangParse(e.to_string()))
|
|
}
|
|
pub(crate) fn pod_request_validation(e: String) -> Self {
|
|
new!(PodRequestValidation(e))
|
|
}
|
|
pub(crate) fn too_many_input_pods(found: usize, max: usize) -> Self {
|
|
new!(TooManyInputPods(found, max))
|
|
}
|
|
pub(crate) fn too_many_public_statements(found: usize, max: usize) -> Self {
|
|
new!(TooManyPublicStatements(found, max))
|
|
}
|
|
pub(crate) fn too_many_statements(found: usize, max: usize) -> Self {
|
|
new!(TooManyStatements(found, max))
|
|
}
|
|
}
|