use cargo::core::Workspace;
use cargo::util::config::Config;
use cargo::ops::{self, UpdateOptions};
use anyhow::bail;
use path_absolutize::*;
pub struct Cargo {
path: String,
cfg: Option< Config >,
}
impl Cargo {
pub fn new( path: &str ) -> Self {
Self {
path: path.to_owned(),
cfg: None,
}
}
pub fn open( &mut self ) -> anyhow::Result<()> {
let cfg = Config::default()?;
self.cfg = Some( cfg );
if let Some( cfg ) = &self.cfg {
let p = std::path::Path::new(&self.path).join("Cargo.toml");
let p = p.absolutize()?;
let _ws = Workspace::new( &p, &cfg )?;
Ok(())
} else {
bail!("No Config");
}
}
pub fn update_workspace( &mut self ) -> anyhow::Result<()> {
if let Some( cfg ) = &self.cfg {
let p = std::path::Path::new(&self.path).join("Cargo.toml");
let p = p.absolutize()?;
let ws = Workspace::new( &p, &cfg )?;
let update_opts = UpdateOptions {
aggressive: false,
precise: None,
to_update: Vec::new(),
dry_run: false,
workspace: true,
config: &cfg,
};
ops::update_lockfile(&ws, &update_opts)?;
println!("Updated Cargo.lock for {}", &p.display());
Ok(())
} else {
bail!("No Config");
}
}
}