bounds-cli 0.5.1

Add a .gitignore and LICENSE to a repository
use std::path::PathBuf;

use serde::Deserialize;

#[derive(Debug)]
pub struct Config {
    pub target: PathBuf,

    pub gitignores: Vec<GitignoreTemplate>,
    pub gitignore_mode: WriteMode,

    pub license: Option<LicenseTemplate>,
    pub license_mode: WriteMode,

    pub author: Option<String>,
}

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum WriteMode {
    Create,
    Merge,
    Replace,
    Skip,
}

#[derive(Clone, Debug, Deserialize)]
pub struct GitignoreTemplate {
    pub key: String,
    pub name: String,
    pub source: String,
}

#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct LicenseSummary {
    pub key: String,
    pub name: String,
    pub spdx_id: String,
    pub url: String,
}

#[derive(Clone, Debug, Deserialize)]
pub struct LicenseTemplate {
    pub name: String,
    pub spdx_id: String,
    pub description: String,
    pub body: String,
}

impl LicenseTemplate {
    pub fn needs_author(&self) -> bool {
        self.body.contains("[fullname]") || self.body.contains("[name of copyright owner]")
    }
}

#[cfg(test)]
mod tests {
    use super::LicenseTemplate;

    fn license(body: &str) -> LicenseTemplate {
        LicenseTemplate {
            name: "Test license".to_owned(),
            spdx_id: "Test".to_owned(),
            description: "A license used by tests".to_owned(),
            body: body.to_owned(),
        }
    }

    #[test]
    fn detects_supported_author_placeholders() {
        assert!(license("Copyright [fullname]").needs_author());
        assert!(license("Copyright [name of copyright owner]").needs_author());
        assert!(!license("No copyright placeholder").needs_author());
    }
}