corge-rs 0.1.1

A small Rust-powered build tool for C projects: init, build, deps, profiles, and tooling.
Documentation
use std::process::Command;
use std::str::FromStr;
use target_lexicon::{OperatingSystem, Triple};
use crate::std_command_ext::ExecuteCommand;

#[derive(Debug)]
pub enum Extension {
    Object,
    Executable,
    StaticLibrary,
    DynamicLibrary,
}

impl Extension {
    fn linux_extension(&self) -> Option<String> {
        match self {
            Extension::Object => Some("o".to_string()),
            Extension::Executable => None,
            Extension::StaticLibrary => Some("a".to_string()),
            Extension::DynamicLibrary => Some("so".to_string())
        }
    }
    fn macos_extension(&self) -> Option<String> {
        match self {
            Extension::Object => Some("o".to_string()),
            Extension::Executable => None,
            Extension::StaticLibrary => Some("a".to_string()),
            Extension::DynamicLibrary => Some("dylib".to_string())
        }
    }
    fn windows_extension(&self) -> Option<String> {
        match self {
            Extension::Object => Some("obj".to_string()),
            Extension::Executable => Some("exe".to_string()),
            Extension::StaticLibrary => Some("lib".to_string()),
            Extension::DynamicLibrary => Some("dll".to_string())
        }
    }

    fn for_triple(&self, target_triple: &str) -> Option<String> {
        let operating_system =
            match Triple::from_str(target_triple) {
                Ok(triple) => triple.operating_system,
                Err(_) => OperatingSystem::Linux
            };

        match operating_system {
            OperatingSystem::Linux => self.linux_extension(),
            OperatingSystem::MacOSX(_) => self.macos_extension(),
            OperatingSystem::Windows => self.windows_extension(),
            _ => self.linux_extension(),
        }
    }

    fn for_compiler(&self, compiler: &str) -> Option<String> {
        log::info!("{:?}. Getting extention for compiler: {}", &self, compiler);
        let stdout = Command::new(compiler)
            .arg("-dumpmachine")
            .execute(true)
            .expect(format!("Failed to execute: {} -dumpmachine", compiler).as_str());

        /* fixme */
        let triple = stdout.strip_suffix("\n").unwrap().to_string();

        self.for_triple(&triple)
    }

    pub fn file_name(&self, name: &str, compiler: &str) -> String {
        let extension = match self.for_compiler(compiler) {
            None => "",
            Some(extension) => &format!(".{}", extension),
        };

        match self {
            Extension::Object => format!("{}{}", name, extension),
            Extension::Executable =>  format!("{}{}", name, extension),
            Extension::StaticLibrary => format!("lib{}{}", name, extension),
            Extension::DynamicLibrary => format!("lib{}{}", name, extension),
        }
    }
}