// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

use crate::sdk::{strip_tool_path, TargetOptions};
use failure::{bail, Error, ResultExt};
use std::path::PathBuf;
use std::process::Command;
use std::time::Duration;
use uname::uname;

#[allow(dead_code)]
pub fn duration_as_milliseconds(duration: &Duration) -> u64 {
    let subsec_ms: u64 = u64::from(duration.subsec_nanos()) / 1_000_000;
    duration.as_secs() * 1000 + subsec_ms
}

pub fn is_mac() -> bool {
    uname().unwrap().sysname == "Darwin"
}

pub fn strip_binary(
    binary: &PathBuf, target_options: &TargetOptions<'_, '_>,
) -> Result<PathBuf, Error> {
    let file_name = binary.file_name().unwrap();
    let new_file_name = file_name.to_string_lossy().into_owned() + "_stripped";
    let target_path = binary.parent().unwrap().join(new_file_name);
    let strip_result = Command::new(strip_tool_path(target_options)?)
        .arg("-strip-all")
        .arg(binary)
        .arg(&target_path)
        .status()
        .context("strip command failed to start")?;

    if !strip_result.success() {
        bail!("strip failed with error {:?}", strip_result);
    }

    Ok(target_path)
}
