Skip to main content

changeset_operations/traits/
manifest_writer.rs

1use std::path::Path;
2
3use changeset_manifest::{InitConfig, MetadataSection};
4use semver::Version;
5
6use crate::Result;
7use crate::traits::InheritedVersionChecker;
8
9pub trait FullManifestWriter:
10    ManifestVersionWriter
11    + ManifestDependencyWriter
12    + WorkspaceVersionManager
13    + InheritedVersionChecker
14    + LockfileUpdater
15{
16}
17impl<
18    T: ManifestVersionWriter
19        + ManifestDependencyWriter
20        + WorkspaceVersionManager
21        + InheritedVersionChecker
22        + LockfileUpdater,
23> FullManifestWriter for T
24{
25}
26
27pub trait ManifestVersionWriter: Send + Sync {
28    /// # Errors
29    ///
30    /// Propagates manifest write errors.
31    fn write_version(&self, manifest_path: &Path, new_version: &Version) -> Result<()>;
32
33    /// # Errors
34    ///
35    /// Propagates manifest read/verification errors.
36    fn verify_version(&self, manifest_path: &Path, expected: &Version) -> Result<()>;
37}
38
39pub trait ManifestDependencyWriter: Send + Sync {
40    /// # Errors
41    ///
42    /// Propagates manifest read/write errors.
43    fn update_dependency_version(
44        &self,
45        manifest_path: &Path,
46        dependency_name: &str,
47        new_version: &Version,
48    ) -> Result<bool>;
49}
50
51pub trait WorkspaceVersionManager: Send + Sync {
52    /// Returns `Ok(None)` if the workspace version field is not present.
53    ///
54    /// # Errors
55    ///
56    /// Propagates manifest read errors.
57    fn read_workspace_version(&self, manifest_path: &Path) -> Result<Option<Version>>;
58
59    /// # Errors
60    ///
61    /// Propagates manifest write errors.
62    fn remove_workspace_version(&self, manifest_path: &Path) -> Result<()>;
63
64    /// # Errors
65    ///
66    /// Propagates manifest write errors.
67    fn write_workspace_version(&self, manifest_path: &Path, version: &Version) -> Result<()>;
68}
69
70pub trait LockfileUpdater: Send + Sync {
71    /// # Errors
72    ///
73    /// Returns an error if the `cargo update --workspace` command fails.
74    fn update_lockfile(&self, project_root: &Path) -> Result<()>;
75
76    /// # Errors
77    ///
78    /// Returns an error if the lockfile exists but cannot be read.
79    fn read_lockfile(&self, project_root: &Path) -> Result<Option<Vec<u8>>>;
80
81    /// # Errors
82    ///
83    /// Returns an error if the lockfile cannot be written.
84    fn restore_lockfile(&self, project_root: &Path, content: &[u8]) -> Result<()>;
85
86    /// # Errors
87    ///
88    /// Returns an error if the lockfile exists but cannot be removed.
89    fn remove_lockfile(&self, project_root: &Path) -> Result<()>;
90}
91
92pub trait ManifestMetadataWriter: Send + Sync {
93    /// # Errors
94    ///
95    /// Propagates manifest write errors.
96    fn write_metadata(
97        &self,
98        manifest_path: &Path,
99        section: MetadataSection,
100        config: &InitConfig,
101    ) -> Result<()>;
102}