docker-registry-client 0.2.0

Communicate with Docker Registries to fetch image metadata.
Documentation
use url::Url;

use crate::docker::token_cache;

#[derive(Debug)]
pub enum Error {
    GetManifest(reqwest::Error),
    InvalidManifestUrl(url::ParseError),
    ExtractManifestBody(reqwest::Error),
    FailedManifestRequest(reqwest::StatusCode, String),
    DeserializeManifestBody(serde_json::Error, String),
    ParseManifestAcceptHeader(reqwest::header::InvalidHeaderValue),
    ManifestNotFound(Url),
    MissingDockerContentDigestHeader,
    ParseDockerContentDigestHeader(reqwest::header::ToStrError),

    InvalidTokenUrl(url::ParseError),
    GetToken(reqwest::Error),
    ExtractTokenBody(reqwest::Error),
    DeserializeToken(serde_json::Error, String),
    ParseAuthorizationHeader(reqwest::header::InvalidHeaderValue),
    InvalidImageUrl(crate::image::FromUrlError),
    FetchToken(token_cache::FetchError),
    StoreToken(token_cache::StoreError),
}

impl std::fmt::Display for Error {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Self::GetManifest(e) => write!(f, "Failed to get manifest: {e}"),
            Self::InvalidManifestUrl(e) => write!(f, "Invalid manifest URL: {e}"),
            Self::ExtractManifestBody(e) => write!(f, "Failed to extract manifest body: {e}"),
            Self::FailedManifestRequest(e, s) => {
                write!(f, "Failed manifest request: status: {e}, body: {s}")
            }
            Self::DeserializeManifestBody(e, s) => {
                write!(f, "Failed to deserialize manifest body: {e}, body: {s}")
            }
            Self::ParseManifestAcceptHeader(e) => {
                write!(f, "Failed to parse manifest accept header: {e}")
            }
            Self::ManifestNotFound(u) => write!(f, "Manifest at url {u} was not found"),
            Self::MissingDockerContentDigestHeader => {
                write!(f, "Missing Docker content digest header")
            }
            Self::ParseDockerContentDigestHeader(e) => {
                write!(f, "Failed to parse Docker content digest header: {e}")
            }

            Self::InvalidTokenUrl(e) => write!(f, "Invalid token URL: {e}"),
            Self::GetToken(e) => write!(f, "Failed to get token: {e}"),
            Self::ExtractTokenBody(e) => write!(f, "Failed to extract token body: {e}"),
            Self::DeserializeToken(e, s) => {
                write!(f, "Failed to deserialize token: {e}, body: {s}")
            }
            Self::ParseAuthorizationHeader(e) => {
                write!(f, "Failed to parse authorization header: {e}")
            }
            Self::InvalidImageUrl(e) => {
                write!(f, "Failed to parse image from url: {e}")
            }
            Self::FetchToken(e) => write!(f, "Failed to fetch token from cache: {e}"),
            Self::StoreToken(e) => write!(f, "Failed to store token in cache: {e}"),
        }
    }
}

impl std::error::Error for Error {}