use anyhow::Result;
const GLTF_VALIDATOR_BASE_URL: &str =
"https://github.com/KhronosGroup/glTF-Validator/releases/download";
const GLTF_VALIDATOR_VERSION: &str = "2.0.0-dev.3.10";
#[cfg(target_os = "macos")]
fn get_download_url() -> String {
format!(
"{}/{}/gltf_validator-{}-macos64.tar.xz",
GLTF_VALIDATOR_BASE_URL, GLTF_VALIDATOR_VERSION, GLTF_VALIDATOR_VERSION
)
}
#[cfg(target_os = "linux")]
fn get_download_url() -> String {
format!(
"{}/{}/gltf_validator-{}-linux64.tar.xz",
GLTF_VALIDATOR_BASE_URL, GLTF_VALIDATOR_VERSION, GLTF_VALIDATOR_VERSION
)
}
fn default_bin_dir() -> std::path::PathBuf {
std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap())
}
fn installed_path() -> std::path::PathBuf {
let mut default_path = default_bin_dir();
default_path = default_path.join("gltf_validator");
default_path
}
fn is_installed() -> bool {
let installed_path = installed_path();
installed_path.exists()
}
fn download(file_name: &str) -> Result<std::path::PathBuf> {
let url = get_download_url();
println!("Downloading gltf_validator from {}", url);
let mut response = reqwest::blocking::get(url)?;
let tmp_path = std::env::temp_dir().join(file_name);
let mut file = std::fs::File::create(tmp_path.clone())?;
std::io::copy(&mut response, &mut file)?;
Ok(tmp_path)
}
fn install() -> Result<()> {
if !is_installed() {
let file_name = "binary.tar.xz";
let tmp_path = download(file_name)?;
let bin_dir = default_bin_dir();
std::fs::create_dir_all(&bin_dir)?;
let file = std::fs::File::open(&tmp_path)?;
let mut archive = tar::Archive::new(xz::read::XzDecoder::new(file));
let tmp_dir = tempfile::tempdir()?;
archive.unpack(&tmp_dir)?;
let bin_path = tmp_dir.path().join("gltf_validator");
std::fs::copy(bin_path, bin_dir.join("gltf_validator"))?;
std::fs::remove_file(tmp_path)?;
}
let installed_path = default_bin_dir();
let existing_path_var = std::env::var_os("PATH").unwrap_or_default();
let existing_paths = std::env::split_paths(&existing_path_var);
std::env::set_var(
"PATH",
std::env::join_paths(existing_paths.chain(std::iter::once(installed_path)))?,
);
Ok(())
}
fn main() {
if cfg!(target_os = "windows") {
println!("cargo:warning=Windows is not supported.");
return;
}
if cfg!(docsrs) {
return;
}
install().unwrap();
}