use clap::ValueEnum;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(default)]
pub struct StartupConfig {
#[serde(default)]
pub r_source: RSource,
#[serde(default = "default_true")]
pub show_banner: bool,
#[serde(default)]
pub reprex: ReprexMode,
}
fn default_true() -> bool {
true
}
impl Default for StartupConfig {
fn default() -> Self {
StartupConfig {
r_source: RSource::default(),
show_banner: true,
reprex: ReprexMode::Off,
}
}
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema, ValueEnum, Default,
)]
#[serde(rename_all = "lowercase")]
pub enum ReprexMode {
#[default]
Off,
On,
Format,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(untagged)]
pub enum RSource {
Mode(RSourceMode),
Path {
path: PathBuf,
},
}
impl Default for RSource {
fn default() -> Self {
RSource::Mode(RSourceMode::Auto)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum RSourceMode {
Auto,
Rig,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RSourceOverrideInfo {
pub provider: String,
pub file: Option<PathBuf>,
pub key: Option<String>,
pub requested_version: String,
pub resolved_version: String,
}
impl RSourceOverrideInfo {
pub fn display(&self) -> String {
let source = match (&self.file, &self.key) {
(Some(file), Some(key)) => format!("{}:{}", file.display(), key),
(Some(file), None) => file.display().to_string(),
(None, Some(key)) => key.clone(),
(None, None) => "pixi".to_string(),
};
format!(
"{} {} = \"{}\"",
self.provider, source, self.requested_version
)
}
}
#[derive(Debug, Clone, Default)]
pub enum RSourceStatus {
Rig {
version: String,
override_info: Option<RSourceOverrideInfo>,
},
#[default]
Path,
ExplicitPath {
path: PathBuf,
},
}
impl RSourceStatus {
pub fn rig_enabled(&self) -> bool {
matches!(self, RSourceStatus::Rig { .. })
}
pub fn display(&self) -> String {
match self {
RSourceStatus::Rig {
version,
override_info,
} => match override_info {
Some(info) => format!("rig (R {}; override: {})", version, info.display()),
None => format!("rig (R {})", version),
},
RSourceStatus::Path => "PATH".to_string(),
RSourceStatus::ExplicitPath { path } => format!("path ({})", path.display()),
}
}
pub fn override_info(&self) -> Option<&RSourceOverrideInfo> {
match self {
Self::Rig { override_info, .. } => override_info.as_ref(),
Self::Path | Self::ExplicitPath { .. } => None,
}
}
}