| 1 | //! This module contains `Dependency` and the types/functions it uses for deserialization. |
| 2 | |
| 3 | use std::fmt; |
| 4 | |
| 5 | use camino::Utf8PathBuf; |
| 6 | #[cfg (feature = "builder" )] |
| 7 | use derive_builder::Builder; |
| 8 | use semver::VersionReq; |
| 9 | use serde::{Deserialize, Deserializer, Serialize}; |
| 10 | |
| 11 | #[derive (Eq, PartialEq, Clone, Debug, Copy, Hash, Serialize, Deserialize)] |
| 12 | /// Dependencies can come in three kinds |
| 13 | pub enum DependencyKind { |
| 14 | #[serde(rename = "normal" )] |
| 15 | /// The 'normal' kind |
| 16 | Normal, |
| 17 | #[serde(rename = "dev" )] |
| 18 | /// Those used in tests only |
| 19 | Development, |
| 20 | #[serde(rename = "build" )] |
| 21 | /// Those used in build scripts only |
| 22 | Build, |
| 23 | #[doc (hidden)] |
| 24 | #[serde(other)] |
| 25 | Unknown, |
| 26 | } |
| 27 | |
| 28 | impl Default for DependencyKind { |
| 29 | fn default() -> DependencyKind { |
| 30 | DependencyKind::Normal |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | impl fmt::Display for DependencyKind { |
| 35 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| 36 | let s: String = serde_json::to_string(self).unwrap(); |
| 37 | // skip opening and closing quotes |
| 38 | f.write_str(&s[1..s.len() - 1]) |
| 39 | } |
| 40 | } |
| 41 | |
| 42 | /// The `kind` can be `null`, which is interpreted as the default - `Normal`. |
| 43 | pub(super) fn parse_dependency_kind<'de, D>(d: D) -> Result<DependencyKind, D::Error> |
| 44 | where |
| 45 | D: Deserializer<'de>, |
| 46 | { |
| 47 | Deserialize::deserialize(d).map(|x: Option<_>| x.unwrap_or_default()) |
| 48 | } |
| 49 | |
| 50 | #[derive (Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] |
| 51 | #[cfg_attr (feature = "builder" , derive(Builder))] |
| 52 | #[non_exhaustive ] |
| 53 | #[cfg_attr (feature = "builder" , builder(pattern = "owned" , setter(into)))] |
| 54 | /// A dependency of the main crate |
| 55 | pub struct Dependency { |
| 56 | /// Name as given in the `Cargo.toml` |
| 57 | pub name: String, |
| 58 | /// The source of dependency |
| 59 | pub source: Option<String>, |
| 60 | /// The required version |
| 61 | pub req: VersionReq, |
| 62 | /// The kind of dependency this is |
| 63 | #[serde(deserialize_with = "parse_dependency_kind" )] |
| 64 | pub kind: DependencyKind, |
| 65 | /// Whether this dependency is required or optional |
| 66 | pub optional: bool, |
| 67 | /// Whether the default features in this dependency are used. |
| 68 | pub uses_default_features: bool, |
| 69 | /// The list of features enabled for this dependency. |
| 70 | pub features: Vec<String>, |
| 71 | /// The target this dependency is specific to. |
| 72 | /// |
| 73 | /// Use the [`Display`] trait to access the contents. |
| 74 | /// |
| 75 | /// [`Display`]: std::fmt::Display |
| 76 | pub target: Option<Platform>, |
| 77 | /// If the dependency is renamed, this is the new name for the dependency |
| 78 | /// as a string. None if it is not renamed. |
| 79 | pub rename: Option<String>, |
| 80 | /// The URL of the index of the registry where this dependency is from. |
| 81 | /// |
| 82 | /// If None, the dependency is from crates.io. |
| 83 | pub registry: Option<String>, |
| 84 | /// The file system path for a local path dependency. |
| 85 | /// |
| 86 | /// Only produced on cargo 1.51+ |
| 87 | pub path: Option<Utf8PathBuf>, |
| 88 | } |
| 89 | |
| 90 | pub use cargo_platform::Platform; |
| 91 | |