duck-template 0.1.9

A cli tool for generating files from a template just with a json file
mod __test__;
use std::{error::Error, path::Path};

use crate::{
  config::{config_structure::Variant, read_config, serialize_config, write_config},
  hasher::generate_id,
  logger::{LogLevel, log},
  template::parse_source,
};

pub mod create_variant_structure;

pub fn create_variant_command(
  create_variant: &create_variant_structure::CreateVariant,
) -> Result<String, Box<dyn Error>> {
  log(
    LogLevel::Info,
    &format!("🛠 Creating variant... {:?}", create_variant.name),
  );

  let str_buf = read_config(&create_variant.config);
  let mut config = serialize_config(&str_buf);

  let name = if create_variant.name.is_empty() {
    format!("{}-{}", config.name, generate_id())
  } else {
    create_variant.name.clone()
  };

  if create_variant.source.is_empty() {
    return Err("Missing --source/-s argument.".into());
  }

  let total_ignore: Vec<String> = create_variant
    .ignore
    .iter()
    .chain(config.ignore.clone().unwrap_or_default().iter())
    .filter(|s| !s.trim().is_empty())
    .cloned()
    .collect();

  let root = Path::new(&create_variant.source);
  let src_structure = parse_source(root, root, &total_ignore);

  let variant = Variant {
    name: name.clone(),
    description: create_variant.description.clone(),
    src: vec![src_structure],
  };

  config.variants.push(variant);
  write_config(&create_variant.config, &config);

  log(LogLevel::Success, &format!("🛠 Created variant {}...", name));

  Ok(name)
}