1#![allow(non_snake_case, non_camel_case_types)]
7
8use std::{
9 net::AddrParseError,
10 sync::{MutexGuard, PoisonError},
11};
12
13use http::uri::InvalidUri;
14use thiserror::Error;
15
16#[derive(Debug, Error)]
18pub enum VineError {
19 #[error("SideCar '{0}' not found or its gRPC client channel is not ready.")]
22 ClientNotConnected(String),
23
24 #[error("gRPC call failed: {0}")]
26 RPCError(String),
27
28 #[error("JSON serialization error for gRPC payload: {0}")]
30 SerializationError(#[from] serde_json::Error),
31
32 #[error("Tonic transport error: {0}")]
34 TonicTransportError(#[from] tonic::transport::Error),
35
36 #[error(
38 "Request to sidecar '{SideCarIdentifier}' (method: '{MethodName}') timed out after {TimeoutMilliseconds}ms"
39 )]
40 RequestTimeout { SideCarIdentifier:String, MethodName:String, TimeoutMilliseconds:u64 },
41
42 #[error("Internal state lock poisoned: {0}")]
44 InternalLockError(String),
45
46 #[error("Invalid URI: {0}")]
48 InvalidUri(#[from] InvalidUri),
49
50 #[error("Invalid Socket Address: {0}")]
52 AddressParseError(#[from] AddrParseError),
53}
54
55impl<T> From<PoisonError<MutexGuard<'_, T>>> for VineError {
56 fn from(Error:PoisonError<MutexGuard<'_, T>>) -> Self {
57 VineError::InternalLockError(format!("Shared state lock poisoned: {}", Error))
58 }
59}
60
61impl From<tonic::Status> for VineError {
62 fn from(status:tonic::Status) -> Self { VineError::RPCError(status.to_string()) }
63}