cup-cli 0.1.6

A Cargo-like tool for C++ Project Building and Package Management
Documentation
use std::path::{Path, PathBuf};

use crate::config::{Expand, Shelling};

#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct TableConfig {
    pub defines: Option<Vec<String>>,
    pub includes: Option<Vec<String>>,
    pub sources: Option<Vec<String>>,
    pub link_paths: Option<Vec<String>>,
    pub link_libraires: Option<Vec<String>>,
    pub link_options: Option<Vec<String>>,
    pub compile_options: Option<Vec<String>>,
    pub compile_features: Option<Vec<String>>,
}

impl<P: AsRef<Path>> Shelling<anyhow::Result<Table>, P> for TableConfig {
    fn shelling(self, base: P) -> anyhow::Result<Table> {
        Ok(Table {
            defines: self.defines.unwrap_or_default(),
            includes: self.includes.unwrap_or_default().expand(&base)?,
            sources: self.sources.unwrap_or_default().expand(&base)?,
            link_paths: self.link_paths.unwrap_or_default().expand(&base)?,
            link_libraires: self.link_libraires.unwrap_or_default(),
            link_options: self.link_options.unwrap_or_default(),
            compile_options: self.compile_options.unwrap_or_default(),
            compile_features: self.compile_features.unwrap_or_default(),
        })
    }
}

#[derive(Debug, Clone)]
pub struct Table {
    pub defines: Vec<String>,
    pub includes: Vec<PathBuf>,
    pub sources: Vec<PathBuf>,
    pub link_paths: Vec<PathBuf>,
    pub link_libraires: Vec<String>,
    pub link_options: Vec<String>,
    pub compile_options: Vec<String>,
    pub compile_features: Vec<String>,
}

#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ModeTableConfig {
    pub debug: Option<TableConfig>,
    pub release: Option<TableConfig>,
}

impl<P: AsRef<Path>> Shelling<anyhow::Result<ModeTable>, P> for ModeTableConfig {
    fn shelling(self, base: P) -> anyhow::Result<ModeTable> {
        Ok(ModeTable {
            debug: self.debug.unwrap_or_default().shelling(&base)?,
            release: self.release.unwrap_or_default().shelling(&base)?,
        })
    }
}

#[derive(Debug, Clone)]
pub struct ModeTable {
    pub debug: Table,
    pub release: Table,
}