Codex Handbook
app-server/src/request_processors/config_errors.rs 35 lines
use super::*;fn cloud_config_bundle_load_error(err: &std::io::Error) -> Option<&CloudConfigBundleLoadError> {    let mut current: Option<&(dyn std::error::Error + 'static)> = err        .get_ref()        .map(|source| source as &(dyn std::error::Error + 'static));    while let Some(source) = current {        if let Some(cloud_error) = source.downcast_ref::<CloudConfigBundleLoadError>() {            return Some(cloud_error);        }        current = source.source();    }    None}pub(super) fn config_load_error(err: &std::io::Error) -> JSONRPCErrorError {    let data = cloud_config_bundle_load_error(err).map(|cloud_error| {        let mut data = serde_json::json!({            "reason": "cloudConfigBundle",            "errorCode": format!("{:?}", cloud_error.code()),            "detail": cloud_error.to_string(),        });        if let Some(status_code) = cloud_error.status_code() {            data["statusCode"] = serde_json::json!(status_code);        }        if cloud_error.code() == CloudConfigBundleLoadErrorCode::Auth {            data["action"] = serde_json::json!("relogin");        }        data    });    let mut error = invalid_request(format!("failed to load configuration: {err}"));    error.data = data;    error}