use std::env;
use std::fs::File;
use std::io::Read;
use std::path::Path;
use std::path::PathBuf;
use toml;
use toml::Parser as TomlParser;
pub struct Config {
pub sdk_path: PathBuf,
pub ndk_path: PathBuf,
pub ant_command: String,
pub package_name: String,
pub project_name: String,
pub package_label: String,
pub build_targets: Vec<String>,
pub android_version: u32,
pub assets_path: Option<PathBuf>,
pub release: bool,
}
pub fn load(manifest_path: &Path) -> Config {
let (package_name, manifest_content) = {
let content = {
let mut file = File::open(manifest_path).unwrap();
let mut content = String::new();
file.read_to_string(&mut content).unwrap();
content
};
let toml = TomlParser::new(&content).parse().unwrap();
let decoded: TomlPackage = toml::decode(toml["package"].clone()).unwrap();
let package_name = decoded.name.clone();
(package_name, decoded.metadata.and_then(|m| m.android))
};
let ndk_path = env::var("NDK_HOME").expect("Please set the path to the Android NDK with the \
$NDK_HOME environment variable.");
let sdk_path = {
let mut try = env::var("ANDROID_SDK_HOME").ok();
if try.is_none() {
try = env::var("ANDROID_HOME").ok();
}
try.expect("Please set the path to the Android SDK with either the $ANDROID_SDK_HOME or \
the $ANDROID_HOME environment variable.")
};
Config {
sdk_path: Path::new(&sdk_path).to_owned(),
ndk_path: Path::new(&ndk_path).to_owned(),
ant_command: if cfg!(target_os = "windows") { "ant.bat" } else { "ant" }.to_owned(),
package_name: manifest_content.as_ref().and_then(|a| a.package_name.clone())
.unwrap_or_else(|| format!("rust.{}", package_name)),
project_name: package_name.clone(),
package_label: manifest_content.as_ref().and_then(|a| a.label.clone())
.unwrap_or_else(|| package_name.clone()),
build_targets: vec!["arm-linux-androideabi".to_owned()],
android_version: manifest_content.as_ref().and_then(|a| a.android_version).unwrap_or(18),
assets_path: manifest_content.as_ref().and_then(|a| a.assets.as_ref())
.map(|p| manifest_path.parent().unwrap().join(p)),
release: false,
}
}
#[derive(Debug, Clone, RustcDecodable)]
struct TomlPackage {
name: String,
metadata: Option<TomlMetadata>,
}
#[derive(Debug, Clone, RustcDecodable)]
struct TomlMetadata {
android: Option<TomlAndroid>,
}
#[derive(Debug, Clone, RustcDecodable)]
struct TomlAndroid {
package_name: Option<String>,
label: Option<String>,
assets: Option<String>,
android_version: Option<u32>,
}