summaryrefslogtreecommitdiff
path: root/src/rust.rs
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-03-28 17:13:27 +0300
committerLars Wirzenius <liw@liw.fi>2021-03-29 10:38:23 +0300
commit3783b6ace86957c95e5137c7645af319dd2462e9 (patch)
treef4649980e94680e9c277611e4c7b7988d0591f96 /src/rust.rs
parent53db547b3a4dc45aaa33b24f5b85da1e3397a38d (diff)
downloadbumper-rs-3783b6ace86957c95e5137c7645af319dd2462e9.tar.gz
feat: set version in Cargo.toml for Rust projects
Diffstat (limited to 'src/rust.rs')
-rw-r--r--src/rust.rs80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/rust.rs b/src/rust.rs
new file mode 100644
index 0000000..192c387
--- /dev/null
+++ b/src/rust.rs
@@ -0,0 +1,80 @@
+use crate::errors::BumperError;
+use cargo_edit::Manifest;
+use log::{debug, info};
+use std::path::{Path, PathBuf};
+use toml_edit::{Item, Value};
+
+pub struct Rust {
+ dirname: PathBuf,
+ cargo_toml: CargoToml,
+}
+
+impl Rust {
+ pub fn new(dirname: &Path) -> Result<Self, BumperError> {
+ let cargo_toml = dirname.join("Cargo.toml");
+ if cargo_toml.exists() {
+ return Ok(Self {
+ dirname: dirname.to_path_buf(),
+ cargo_toml: CargoToml::parse(&cargo_toml)?,
+ });
+ }
+ Err(BumperError::UnknownProjectKind(dirname.to_path_buf()))
+ }
+
+ pub fn set_version(&mut self, version: &str) -> Result<(), BumperError> {
+ debug!("parsing Cargo.toml from {}", self.dirname.display());
+ // debug!("Cargo.toml:\n{:#?}", self.cargo_toml);
+ self.cargo_toml.set_version(version)?;
+ self.cargo_toml.write()?;
+
+ info!(
+ "Rust project {}, in {}, version set to {}",
+ self.dirname.display(),
+ "xxx",
+ version
+ );
+ Ok(())
+ }
+}
+
+#[derive(Debug)]
+struct CargoToml {
+ dirname: PathBuf,
+ manifest: Manifest,
+}
+
+impl CargoToml {
+ fn parse(dirname: &Path) -> Result<Self, BumperError> {
+ let manifest = Manifest::open(&Some(dirname.to_path_buf()))
+ .map_err(|err| BumperError::FromToml(dirname.to_path_buf(), err))?;
+ Ok(Self {
+ dirname: dirname.to_path_buf(),
+ manifest,
+ })
+ }
+
+ fn write(&self) -> Result<(), BumperError> {
+ debug!("saving Cargo.toml to {}", self.dirname.display());
+ let mut file = Manifest::find_file(&Some(self.dirname.to_path_buf()))
+ .map_err(|err| BumperError::CargoTomlNotFound(self.dirname.to_path_buf(), err))?;
+ self.manifest
+ .write_to_file(&mut file)
+ .map_err(|err| BumperError::WriteToml(self.dirname.to_path_buf(), err))?;
+ Ok(())
+ }
+
+ fn set_version(&mut self, version: &str) -> Result<(), BumperError> {
+ let package = self
+ .manifest
+ .get_table(&["package".to_string()])
+ .map_err(BumperError::NoPackage)?;
+ if let Some(package) = package.as_table_mut() {
+ debug!("setting Cargo.toml set version to {} in memory", version);
+ let v = package.entry("version");
+ *v = Item::Value(Value::from(version));
+ } else {
+ return Err(BumperError::ProjectNotTable);
+ }
+ Ok(())
+ }
+}