1use crate::ContextSite;
4use alloc::string::String;
5use alloc::vec::Vec;
6
7#[derive(Debug, Clone, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
9#[serde(default, deny_unknown_fields, rename_all = "kebab-case")]
10pub struct DependencySearch {
11 pub depth: Option<usize>,
13 pub include_dev: Option<bool>,
15 pub include_build: Option<bool>,
17 pub all_optional: Option<bool>,
19 pub features: Option<Vec<String>>,
21 pub all_features: Option<bool>,
23 pub no_default_features: Option<bool>,
25 pub target: Option<String>,
27 pub cache_dir: Option<String>,
29 pub check_latest: Option<bool>,
31 pub fail_on_findings: Option<bool>,
33}
34
35impl DependencySearch {
36 #[cfg(feature = "std")]
37 pub(crate) fn fill_from(mut self, defaults: &Self) -> Self {
38 self.depth = self.depth.or(defaults.depth);
39 self.include_dev = self.include_dev.or(defaults.include_dev);
40 self.include_build = self.include_build.or(defaults.include_build);
41 self.all_optional = self.all_optional.or(defaults.all_optional);
42 self.features = self.features.or_else(|| defaults.features.clone());
43 self.all_features = self.all_features.or(defaults.all_features);
44 self.no_default_features = self.no_default_features.or(defaults.no_default_features);
45 self.target = self.target.or_else(|| defaults.target.clone());
46 self.cache_dir = self.cache_dir.or_else(|| defaults.cache_dir.clone());
47 self.check_latest = self.check_latest.or(defaults.check_latest);
48 self.fail_on_findings = self.fail_on_findings.or(defaults.fail_on_findings);
49 self
50 }
51}
52
53#[derive(
55 Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, serde::Serialize, serde::Deserialize,
56)]
57#[serde(rename_all = "kebab-case")]
58pub enum ContextAccess {
59 PublicFunction,
61 PublicMethod,
63 InternalFunction,
65 InternalMethod,
67 Embedded,
69 Unresolved,
71}
72
73#[derive(
75 Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, serde::Serialize, serde::Deserialize,
76)]
77#[serde(rename_all = "kebab-case")]
78pub enum ReuseAction {
79 ReuseApi,
81 UpgradeApi,
83 RequestExtraction,
85 Unresolved,
87}
88
89#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
91pub struct ExistingIssue {
92 pub url: String,
94 pub state: String,
96}
97
98#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
100pub struct DependencyCandidate {
101 pub package: String,
103 pub version: String,
105 pub source: String,
107 pub depth: usize,
109 pub site: ContextSite,
111 pub access: ContextAccess,
113 pub api_path: Option<String>,
115 pub conditions: Vec<String>,
117 pub notes: Vec<String>,
119 pub action: ReuseAction,
121 pub repository: Option<String>,
123 pub source_url: Option<String>,
125 pub issue_url: Option<String>,
127 pub existing_issue: Option<ExistingIssue>,
129 pub lookup_warning: Option<String>,
131}
132
133#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
135pub struct ReuseGroup {
136 pub hash: String,
138 pub tokens: usize,
140 pub local: ContextSite,
142 pub candidates: Vec<DependencyCandidate>,
144}
145
146#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
148pub struct DependencyCoverage {
149 pub complete: bool,
151 pub packages: usize,
153 pub indexed_files: usize,
155 pub cached_files: usize,
157 pub failures: Vec<String>,
159 pub warnings: Vec<String>,
161}
162
163impl Default for DependencyCoverage {
164 fn default() -> Self {
165 Self {
166 complete: true,
167 packages: 0,
168 indexed_files: 0,
169 cached_files: 0,
170 failures: Vec::new(),
171 warnings: Vec::new(),
172 }
173 }
174}
175
176#[derive(Debug, Clone, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
178pub struct ReuseReport {
179 pub groups: Vec<ReuseGroup>,
181 pub coverage: DependencyCoverage,
183 #[serde(skip)]
185 pub fail_on_findings: bool,
186}
187
188#[cfg(feature = "std")]
189pub(crate) struct PackageSource {
190 pub(crate) name: String,
191 pub(crate) version: String,
192 pub(crate) source: String,
193 pub(crate) root: std::path::PathBuf,
194 pub(crate) repository: Option<String>,
195 pub(crate) source_hashes: alloc::collections::BTreeMap<String, String>,
196}