quanttide_devops/contract/
source.rs1use serde::{Deserialize, Serialize};
2use std::path::Path;
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
8#[serde(rename_all = "snake_case")]
9pub struct Source {
10 #[serde(default)]
11 pub version: VersionSource,
12}
13
14impl Default for Source {
15 fn default() -> Self {
16 Self {
17 version: VersionSource {
18 source_type: SourceType::Auto,
19 path: None,
20 },
21 }
22 }
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
27#[serde(rename_all = "snake_case")]
28pub struct VersionSource {
29 #[serde(default, rename = "type")]
31 pub source_type: SourceType,
32 #[serde(default)]
33 pub path: Option<String>,
34}
35
36impl Default for VersionSource {
37 fn default() -> Self {
38 Self {
39 source_type: SourceType::Auto,
40 path: None,
41 }
42 }
43}
44
45#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
47#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
48#[serde(rename_all = "snake_case")]
49pub enum SourceType {
50 Cargo,
51 Pyproject,
52 TagOnly,
54 Pubspec,
55 #[serde(rename = "package.json")]
56 PackageJson,
57 #[default]
59 Auto,
60}
61
62impl SourceType {
63 pub fn detect(dir: &Path) -> Self {
65 if dir.join("Cargo.toml").exists() {
66 Self::Cargo
67 } else if dir.join("pyproject.toml").exists() {
68 Self::Pyproject
69 } else if dir.join("pubspec.yaml").exists() {
70 Self::Pubspec
71 } else if dir.join("package.json").exists() {
72 Self::PackageJson
73 } else {
74 Self::TagOnly
75 }
76 }
77}