Skip to main content

codewhale_config/route/
errors.rs

1//! Route resolution errors (#3384).
2//!
3//! `thiserror` is not a dependency of this crate, so [`std::fmt::Display`] and
4//! [`std::error::Error`] are hand-implemented. No new dependency is added.
5
6use std::fmt;
7
8use super::ids::ProviderId;
9
10/// Why a [`super::resolver::RouteResolver`] could not produce a candidate.
11#[derive(Debug, Clone)]
12pub enum RouteError {
13    /// The requested model selector was empty.
14    EmptyModel,
15    /// The named provider could not be resolved.
16    InvalidProvider(String),
17    /// A model matched multiple providers; the caller must disambiguate.
18    AmbiguousModel(Vec<ProviderId>),
19    /// A clearly-foreign model was requested for a strict direct provider.
20    ForeignModelForDirectProvider {
21        /// The strict direct provider that rejected the model.
22        provider: ProviderId,
23        /// The foreign model selector that was rejected.
24        model: String,
25    },
26    /// A model-aware provider did not prove a supported request protocol for
27    /// the selected model/endpoint.
28    UnsupportedModelProtocol {
29        /// Provider whose catalog row was incomplete or unsupported.
30        provider: ProviderId,
31        /// Selected provider-owned model id.
32        model: String,
33        /// Catalog endpoint key, when one was present.
34        endpoint_key: String,
35    },
36}
37
38impl fmt::Display for RouteError {
39    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
40        match self {
41            Self::EmptyModel => write!(f, "model selector was empty"),
42            Self::InvalidProvider(name) => write!(f, "invalid provider: {name}"),
43            Self::AmbiguousModel(providers) => {
44                let names: Vec<&str> = providers.iter().map(ProviderId::as_str).collect();
45                write!(
46                    f,
47                    "model matches multiple providers ({}); specify a provider",
48                    names.join(", ")
49                )
50            }
51            Self::ForeignModelForDirectProvider { provider, model } => write!(
52                f,
53                "model {model:?} is not served by direct provider {}",
54                provider.as_str()
55            ),
56            Self::UnsupportedModelProtocol {
57                provider,
58                model,
59                endpoint_key,
60            } => write!(
61                f,
62                "model {model:?} on provider {} has unsupported or unproven endpoint {endpoint_key:?}",
63                provider.as_str()
64            ),
65        }
66    }
67}
68
69impl std::error::Error for RouteError {}