1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
use errors::{Result, ChainErr}; use std::path::Path; use toml; use file_utils::{PathBufWithAdded, path_to_str, save_toml, load_toml}; pub fn set_cargo_override<P1: AsRef<Path>, P: AsRef<Path>>(cargo_toml_location: P1, paths: &[P]) -> Result<()> { let mut data = load_toml(cargo_toml_location.as_ref())?; data.insert("replace".to_string(), toml::Value::Table({ let mut table = toml::Table::new(); for path in paths { let item_cargo_toml_path = path.as_ref().with_added("Cargo.toml"); let item_data = load_toml(&item_cargo_toml_path)?; let package = item_data.get("package") .chain_err(|| "no 'package' in Cargo.toml")?; let name = package.as_table() .chain_err(|| "'package' must be a table")? .get("name") .chain_err(|| "no 'package.name' in Cargo.toml")?; let version = package.as_table() .chain_err(|| "'package' must be a table")? .get("version") .chain_err(|| "no 'package.version' in Cargo.toml")?; let key = format!("{}:{}", name.as_str() .chain_err(|| "'package.name' must be a string")?, version.as_str() .chain_err(|| "'package.version' must be a string")?); let mut value = toml::Table::new(); value.insert("path".to_string(), toml::Value::String(path_to_str(path.as_ref())?.to_string())); table.insert(key, toml::Value::Table(value)); } table })); save_toml(cargo_toml_location.as_ref(), data)?; Ok(()) }