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(())
}