use crate::{
task::instruction::{Args, Input},
Unit,
};
use libipld::Ipld;
use serde::de::Error as DeError;
use std::io;
#[derive(thiserror::Error, Debug)]
pub enum Error<T> {
#[error("failed to encode CID: {0}")]
CidEncode(#[from] libipld::cid::Error),
#[error("condition not met: {0}")]
ConditionNotMet(String),
#[error("failed to decode/encode DAG-CBOR: {0}")]
DagCborTranslation(#[from] anyhow::Error),
#[error("cannot convert from Ipld structure: {0}")]
FromIpld(#[from] libipld::error::SerdeError),
#[error("failed to decode/encode structure: {0}")]
FromMultibase(#[from] libipld::multibase::Error),
#[error("invalid discriminant {0:#?}")]
InvalidDiscriminant(T),
#[error("no {0} field set")]
MissingField(String),
#[error(transparent)]
ParseResource(#[from] url::ParseError),
#[error("unknown error")]
Unknown,
#[error("unexpected Ipld type: {0:#?}")]
UnexpectedIpldType(Ipld),
#[error(transparent)]
Utf8(#[from] std::str::Utf8Error),
#[error("error writing data to console: {0}")]
Io(#[from] io::Error),
}
impl<T> Error<T> {
pub fn unexpected_ipld(ipld: Ipld) -> Self {
Error::UnexpectedIpldType(ipld)
}
pub fn not_an_ipld_list() -> Self {
Error::FromIpld(libipld::error::SerdeError::invalid_type(
serde::de::Unexpected::Seq,
&"an Ipld list / sequence",
))
}
}
impl From<Error<Unit>> for Error<String> {
fn from(_err: Error<Unit>) -> Self {
Error::Unknown
}
}
impl From<Error<String>> for Error<Unit> {
fn from(_err: Error<String>) -> Error<Unit> {
Error::Unknown
}
}
impl<T> From<std::convert::Infallible> for Error<T> {
fn from(err: std::convert::Infallible) -> Self {
match err {}
}
}
#[derive(thiserror::Error, Debug)]
pub enum InputParseError<T> {
#[error("cannot convert from Ipld structure: {0}")]
FromIpld(#[from] libipld::error::SerdeError),
#[error("cannot convert from Ipld structure into arguments: {0:#?}")]
IpldToArgs(Args<T>),
#[error("unexpected task input: {0:#?}")]
UnexpectedTaskInput(Input<T>),
#[error(transparent)]
Invocation(#[from] Error<T>),
}
impl<T> From<std::convert::Infallible> for InputParseError<T> {
fn from(err: std::convert::Infallible) -> Self {
match err {}
}
}
#[derive(thiserror::Error, Debug)]
pub enum ResolveError {
#[error(transparent)]
Runtime(#[from] anyhow::Error),
#[error("transport error during resolve phase of input Cid: {0}")]
Transport(String),
#[error("error resolving input Cid: {0}")]
UnresolvedCid(String),
}
impl From<std::convert::Infallible> for ResolveError {
fn from(err: std::convert::Infallible) -> Self {
match err {}
}
}