entrenar/sovereign/nix/
crate_spec.rs1use serde::{Deserialize, Serialize};
4use std::path::PathBuf;
5
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8pub struct CrateSpec {
9 pub name: String,
11 pub path: Option<PathBuf>,
13 pub version: Option<String>,
15 pub git: Option<String>,
17 pub rev: Option<String>,
19}
20
21impl CrateSpec {
22 pub fn local(name: impl Into<String>, path: impl Into<PathBuf>) -> Self {
24 Self { name: name.into(), path: Some(path.into()), version: None, git: None, rev: None }
25 }
26
27 pub fn crates_io(name: impl Into<String>, version: impl Into<String>) -> Self {
29 Self { name: name.into(), path: None, version: Some(version.into()), git: None, rev: None }
30 }
31
32 pub fn git(name: impl Into<String>, url: impl Into<String>, rev: impl Into<String>) -> Self {
34 Self {
35 name: name.into(),
36 path: None,
37 version: None,
38 git: Some(url.into()),
39 rev: Some(rev.into()),
40 }
41 }
42
43 pub fn is_local(&self) -> bool {
45 self.path.is_some()
46 }
47
48 pub fn is_crates_io(&self) -> bool {
50 self.version.is_some() && self.git.is_none()
51 }
52
53 pub fn is_git(&self) -> bool {
55 self.git.is_some()
56 }
57
58 pub fn nix_source(&self) -> String {
60 if let Some(path) = &self.path {
61 format!("./{}", path.display())
62 } else if let Some(version) = &self.version {
63 format!("crates.io:{version}")
64 } else if let (Some(git), Some(rev)) = (&self.git, &self.rev) {
65 format!("git:{git}?rev={rev}")
66 } else {
67 "unknown".to_string()
68 }
69 }
70}