cpp_to_rust_common 0.0.1

Common utilities for cpp_to_rust_generator and cpp_to_rust_build_tools
Documentation
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(())
}