1use semver::Version;
2use serde::Serialize;
3use std::collections::{BTreeMap, BTreeSet};
4use std::path::PathBuf;
5
6#[derive(Debug, Clone, Serialize)]
7#[serde(rename_all = "snake_case")]
8pub enum TargetSelectionMode {
9 Explicit,
10 SelectedPackage,
11 WorkspaceUniform,
12 WorkspaceMixed,
13 Missing,
14}
15
16#[derive(Debug, Clone, Serialize)]
17pub struct MemberTarget {
18 pub package_id: String,
19 pub package_name: String,
20 pub rust_version: Option<String>,
21}
22
23#[derive(Debug, Clone, Serialize)]
24pub struct TargetSelection {
25 pub mode: TargetSelectionMode,
26 pub target_rust_version: Option<String>,
27 pub members: Vec<MemberTarget>,
28 pub notes: Vec<String>,
29}
30
31#[derive(Debug, Clone, Serialize)]
32#[serde(rename_all = "snake_case")]
33pub enum CompatibilityStatus {
34 Compatible,
35 Incompatible,
36 Unknown,
37}
38
39#[derive(Debug, Clone, Serialize)]
40#[serde(rename_all = "snake_case")]
41pub enum PackageSourceKind {
42 Workspace,
43 Registry,
44 Git,
45 Path,
46 Unknown,
47}
48
49#[derive(Debug, Clone, Serialize)]
50pub struct ResolvedPackage {
51 pub id: String,
52 pub name: String,
53 pub version: Version,
54 pub source: Option<String>,
55 pub source_kind: PackageSourceKind,
56 pub manifest_path: PathBuf,
57 pub rust_version: Option<String>,
58 pub workspace_member: bool,
59}
60
61#[derive(Debug, Clone, Serialize)]
62pub struct DependencyPath {
63 pub member: String,
64 pub target_rust_version: Option<String>,
65 pub packages: Vec<String>,
66}
67
68#[derive(Debug, Clone, Serialize)]
69pub struct PackageIssue {
70 pub package: ResolvedPackage,
71 pub status: CompatibilityStatus,
72 pub target_rust_version: Option<String>,
73 pub reason: String,
74 pub affected_members: BTreeSet<String>,
75 pub paths: Vec<DependencyPath>,
76}
77
78#[derive(Debug, Clone, Serialize)]
79pub struct PackageSummary {
80 pub package_name: String,
81 pub incompatible: usize,
82 pub unknown: usize,
83}
84
85#[derive(Debug, Clone, Serialize)]
86pub struct WorkspaceSummary {
87 pub workspace_root: PathBuf,
88 pub selected_members: Vec<String>,
89 pub is_virtual_workspace: bool,
90 pub resolver: Option<String>,
91 pub recommendations: Vec<String>,
92}
93
94#[derive(Debug, Clone, Serialize)]
95pub struct ScanReport {
96 pub target: TargetSelection,
97 pub workspace: WorkspaceSummary,
98 pub package_summaries: Vec<PackageSummary>,
99 pub incompatible_packages: Vec<PackageIssue>,
100 pub unknown_packages: Vec<PackageIssue>,
101 pub notes: Vec<String>,
102}
103
104#[derive(Debug, Clone, Serialize)]
105pub struct CandidateVersionChange {
106 pub package_name: String,
107 pub source: Option<String>,
108 pub package_label: Option<String>,
109 pub before: Option<String>,
110 pub after: Option<String>,
111}
112
113#[derive(Debug, Clone, Serialize)]
114pub struct ResolveReport {
115 pub current: ScanReport,
116 pub candidate: ScanReport,
117 pub version_changes: Vec<CandidateVersionChange>,
118 pub improved_packages: Vec<String>,
119 pub remaining_blockers: Vec<String>,
120 pub candidate_lockfile: Option<String>,
121 pub notes: Vec<String>,
122}
123
124#[derive(Debug, Clone, Serialize)]
125#[serde(rename_all = "snake_case")]
126pub enum BlockerKind {
127 Compatible,
128 UnknownRustVersion,
129 LockfileDrift,
130 DirectDependencyTooNew,
131 FeatureRequirementTooRestrictive,
132 MixedWorkspaceRustVersionUnification,
133 PathOrGitConstraint,
134 NonRegistryConstraint,
135}
136
137#[derive(Debug, Clone, Serialize)]
138pub struct ExplainReport {
139 pub query: String,
140 pub target: TargetSelection,
141 pub package: Option<ResolvedPackage>,
142 pub current_status: Option<CompatibilityStatus>,
143 pub current_reason: Option<String>,
144 pub current_paths: Vec<DependencyPath>,
145 pub current_rust_version: Option<String>,
146 pub candidate_version: Option<String>,
147 pub candidate_status: Option<CompatibilityStatus>,
148 pub blocker: Option<BlockerKind>,
149 pub notes: Vec<String>,
150 #[serde(skip)]
151 pub workspace_root: PathBuf,
152}
153
154#[derive(Debug, Clone, Serialize)]
155pub struct ManifestSuggestion {
156 pub package_name: String,
157 pub dependency_key: String,
158 pub dependency_name: String,
159 pub manifest_path: PathBuf,
160 pub current_requirement: String,
161 pub suggested_requirement: String,
162 pub reason: String,
163 pub target_rust_version: String,
164 pub section: String,
165}
166
167#[derive(Debug, Clone)]
168pub struct RegistryCandidate {
169 pub version: Version,
170 pub rust_version: Option<Version>,
171 pub yanked: bool,
172 pub features: BTreeSet<String>,
173}
174
175#[derive(Debug, Clone)]
176pub struct DependencyConstraint {
177 pub package_name: String,
178 pub dependency_key: String,
179 pub manifest_path: PathBuf,
180 pub requirement: String,
181 pub source: Option<String>,
182 pub features: BTreeSet<String>,
183 pub uses_default_features: bool,
184 pub optional: bool,
185 pub section: String,
186 pub target_rust_version: Option<Version>,
187}
188
189#[derive(Debug, Clone)]
190pub struct SelectedMember {
191 pub package_id: String,
192 pub package_name: String,
193 pub manifest_path: PathBuf,
194 pub rust_version: Option<Version>,
195}
196
197#[derive(Debug, Clone)]
198pub struct Selection {
199 pub members: Vec<SelectedMember>,
200 pub target: TargetSelection,
201}
202
203#[derive(Debug, Clone)]
204pub struct WorkspaceData {
205 pub workspace_root: PathBuf,
206 pub workspace_manifest: PathBuf,
207 pub is_virtual_workspace: bool,
208 pub resolver: Option<String>,
209 pub recommendations: Vec<String>,
210 pub metadata: cargo_metadata::Metadata,
211 pub packages_by_id: BTreeMap<String, ResolvedPackage>,
212 pub graph: BTreeMap<String, Vec<String>>,
213}