adnv 1.5.0

CLI that tracks, checks and auto-updates infrastructure dependency versions across Terraform, Helm, Docker, Git and npm
Documentation
use std::fmt;

pub use self::{
    docker::DockerSource,
    git::GitSource,
    helm::HelmSource,
    npm::NpmSource,
    terraform::{TerraformSource, TerraformSourceKind},
};
use crate::{Error, Result};

mod docker;
mod git;
mod helm;
mod npm;
mod terraform;

#[serde_with::serde_as]
#[derive(Debug, Clone, PartialEq, Eq, serde::Deserialize)]
pub enum Source {
    Docker(DockerSource),
    Git(GitSource),
    Npm(NpmSource),
    Terraform(
        #[serde_as(as = "serde_with::FromInto<terraform::TerraformSourceSerialized>")]
        TerraformSource,
    ),
    Helm(HelmSource),
}

enum_from!(Source {
    DockerSource => Docker,
    GitSource => Git,
    NpmSource => Npm,
    TerraformSource => Terraform,
    HelmSource => Helm,
});

impl Source {
    pub fn describe(&self) -> String {
        match self {
            Source::Docker(source) => source.describe(),
            Source::Git(source) => source.describe(),
            Source::Npm(source) => source.describe(),
            Source::Terraform(source) => source.describe(),
            Source::Helm(source) => source.describe(),
        }
    }

    pub fn parse_url(url: &url::Url) -> Result<Self> {
        use crate::util::url::UrlExt;

        if url.scheme_main() == "docker" {
            Ok(DockerSource(url.clone()).into())
        } else if url.scheme_main() == "git" {
            Ok(GitSource(url.clone()).into())
        } else if url.scheme() == "terraform" {
            Ok(TerraformSource::parse_url(url)?.into())
        } else if url.scheme().starts_with("helm") {
            Ok(HelmSource::parse_url(url)?.into())
        } else {
            Err(Error::UnknownSourceType(url.clone()))
        }
    }
}

impl fmt::Display for Source {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Source::Docker(_) => f.write_str("Docker image"),
            Source::Git(_) => f.write_str("Git repository"),
            Source::Npm(_) => f.write_str("NPM package"),
            Source::Helm(_) => f.write_str("Helm Chart"),
            Source::Terraform(source) => source.fmt(f),
        }
    }
}