proto_core 0.55.5

Core proto APIs.
Documentation
#![allow(clippy::module_inception)]

mod backends;
mod plugins;
mod settings;
mod tools;

pub use backends::*;
pub use plugins::*;
pub use settings::*;
pub use tools::*;

use schematic::{Config, ConfigEnum, MergeError, MergeResult, PartialConfig, derive_enum};
use serde::Serialize;
use std::collections::BTreeMap;
use std::path::PathBuf;

derive_enum!(
    #[derive(ConfigEnum, Copy, Default)]
    pub enum PluginType {
        Backend,
        #[default]
        Tool,
    }
);

derive_enum!(
    #[derive(ConfigEnum, Copy, Default)]
    #[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
    pub enum ConfigMode {
        Global,
        Local,
        Upwards,
        #[default]
        #[serde(alias = "all")]
        #[cfg_attr(feature = "clap", value(alias("all")))]
        UpwardsGlobal,
    }
);

impl ConfigMode {
    pub fn includes_global(&self) -> bool {
        matches!(self, Self::Global | Self::UpwardsGlobal)
    }

    pub fn only_global(&self) -> bool {
        matches!(self, Self::Global)
    }

    pub fn only_local(&self) -> bool {
        matches!(self, Self::Local)
    }
}

derive_enum!(
    #[derive(ConfigEnum, Default)]
    pub enum DetectStrategy {
        #[default]
        FirstAvailable,
        PreferPrototools,
        OnlyPrototools,
    }
);

derive_enum!(
    #[derive(Copy, ConfigEnum, Default)]
    #[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
    pub enum PinLocation {
        #[serde(alias = "store")]
        #[cfg_attr(feature = "clap", value(alias("store")))]
        Global,
        #[default]
        #[serde(alias = "cwd")]
        #[cfg_attr(feature = "clap", value(alias("cwd")))]
        Local,
        #[serde(alias = "home")]
        #[cfg_attr(feature = "clap", value(alias("home")))]
        User,
    }
);

#[derive(Clone, Debug, PartialEq)]
pub struct EnvFile {
    pub path: PathBuf,
    pub weight: usize,
}

#[derive(Clone, Config, Debug, PartialEq, Serialize)]
#[serde(untagged)]
pub enum EnvVar {
    State(bool),
    Value(String),
}

impl EnvVar {
    pub fn to_value(&self) -> Option<String> {
        match self {
            Self::State(state) => state.then(|| "true".to_owned()),
            Self::Value(value) => Some(value.to_owned()),
        }
    }
}

pub(crate) fn merge_iter<I, V>(mut prev: I, next: I, _context: &()) -> MergeResult<I>
where
    I: IntoIterator<Item = V> + Extend<V>,
{
    prev.extend(next);

    Ok(Some(prev))
}

pub(crate) fn merge_partials_iter<K, V>(
    mut prev: BTreeMap<K, V>,
    next: BTreeMap<K, V>,
    context: &V::Context,
) -> MergeResult<BTreeMap<K, V>>
where
    K: Ord,
    V: Default + PartialConfig,
{
    for (key, value) in next {
        prev.entry(key)
            .or_default()
            .merge(context, value)
            .map_err(MergeError::new)?;
    }

    Ok(Some(prev))
}