Skip to main content

cargo_compatible/
model.rs

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}