use serde::{Deserialize, Serialize};
use std::path::Path;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct Source {
#[serde(default)]
pub version: VersionSource,
}
impl Default for Source {
fn default() -> Self {
Self {
version: VersionSource {
source_type: SourceType::Auto,
path: None,
},
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct VersionSource {
#[serde(default, rename = "type")]
pub source_type: SourceType,
#[serde(default)]
pub path: Option<String>,
}
impl Default for VersionSource {
fn default() -> Self {
Self {
source_type: SourceType::Auto,
path: None,
}
}
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
#[serde(rename_all = "snake_case")]
pub enum SourceType {
Cargo,
Pyproject,
TagOnly,
Pubspec,
#[serde(rename = "package.json")]
PackageJson,
#[default]
Auto,
}
impl SourceType {
pub fn detect(dir: &Path) -> Self {
if dir.join("Cargo.toml").exists() {
Self::Cargo
} else if dir.join("pyproject.toml").exists() {
Self::Pyproject
} else if dir.join("pubspec.yaml").exists() {
Self::Pubspec
} else if dir.join("package.json").exists() {
Self::PackageJson
} else {
Self::TagOnly
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_source_default() {
let s = Source::default();
assert_eq!(s.version.source_type, SourceType::Auto);
assert_eq!(s.version.path, None);
}
#[test]
fn test_version_source_default() {
let vs = VersionSource::default();
assert_eq!(vs.source_type, SourceType::Auto);
assert_eq!(vs.path, None);
}
}