use std::error::Error as StdError;
use std::path::PathBuf;
#[derive(Debug, thiserror::Error)]
pub enum OpError {
#[error("[PARSER] {0}")]
Parser(String),
#[error("[CODE] {0}")]
Code(String),
#[error("[BRANCH] {0}")]
Branch(String),
#[error("[WHILE] {0}")]
Condition(String),
#[error("[FOR] {0}")]
Iteration(String),
#[error("[PROMPT] {0}")]
Prompt(String),
#[error("[EMBEDDING] {0}")]
Embedding(String),
#[error("[RERANK] {0}")]
Rerank(String),
}
#[derive(Debug, thiserror::Error)]
pub enum OperonError {
#[error(transparent)]
Op(#[from] OpError),
#[error("provider error: {0}")]
Provider(String),
#[error("resource hub: {0}")]
ResourceHub(String),
#[error("config: {0}")]
Config(String),
#[error("state: {0}")]
State(String),
#[error("runtime: {0}")]
Runtime(String),
#[error("schema: unsupported schema_version {0}; expected {expected}", expected = SUPPORTED_SCHEMA_VERSION)]
UnsupportedSchema(String),
#[error(
"resource '{key}' references unset environment variable {var:?}\n source: {source_path:?}\n .env paths searched: {env_paths:?}"
)]
EnvVarUnset {
var: String,
key: String,
source_path: Option<PathBuf>,
env_paths: Vec<PathBuf>,
},
}
pub const SUPPORTED_SCHEMA_VERSION: &str = "1.0";
impl From<serde_json::Error> for OperonError {
fn from(e: serde_json::Error) -> Self {
OperonError::Config(e.to_string())
}
}
impl From<serde_yaml::Error> for OperonError {
fn from(e: serde_yaml::Error) -> Self {
OperonError::Config(e.to_string())
}
}
impl From<std::io::Error> for OperonError {
fn from(e: std::io::Error) -> Self {
OperonError::Runtime(e.to_string())
}
}
pub type Result<T> = std::result::Result<T, OperonError>;
pub type BoxError = Box<dyn StdError + Send + Sync + 'static>;