gov-uk-sdk-core 0.1.0

Shared HTTP client, auth, errors, and content negotiation for GOV.UK / Companies House SDK crates.
Documentation
use serde::{Deserialize, Serialize};

/// A best-effort capture of Companies House / GOV.UK API error payload fields.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiMessage {
    #[serde(default)]
    pub error: Option<String>,
    #[serde(default)]
    pub message: Option<String>,
    #[serde(rename = "type", default)]
    pub type_field: Option<String>,
}

impl ApiMessage {
    /// Best single-line summary: first non-empty of `error`, `message`, or `type_field`.
    pub fn summary(&self) -> String {
        if let Some(ref e) = self.error {
            return e.clone();
        }
        if let Some(ref m) = self.message {
            return m.clone();
        }
        if let Some(ref t) = self.type_field {
            return t.clone();
        }
        String::new()
    }
}

/// Try to deserialize API error bodies as a JSON array or single object of messages.
pub(crate) fn parse_error_messages_slice(bytes: &[u8]) -> Vec<ApiMessage> {
    if bytes.is_empty() {
        return vec![];
    }
    if let Ok(msgs) = serde_json::from_slice::<Vec<ApiMessage>>(bytes) {
        return msgs;
    }
    if let Ok(m) = serde_json::from_slice::<ApiMessage>(bytes) {
        return vec![m];
    }
    vec![]
}