holochain_scaffolding_cli 0.4000.4

CLI to easily generate and modify holochain apps
Documentation
use std::{ffi::OsString, path::PathBuf};

use serde::Serialize;

use crate::{
    error::ScaffoldResult,
    file_tree::{file_content, FileTree},
    scaffold::web_app::package_manager::PackageManager,
    versions,
};

use super::{
    build_handlebars, render_template_file_tree_and_merge_with_existing, ScaffoldedTemplate,
};

#[derive(Serialize)]
pub struct ScaffoldWebAppData<'a> {
    pub app_name: &'a str,
    pub holochain_version: &'a str,
    pub hdk_version: &'a str,
    pub hdi_version: &'a str,
    pub holochain_client_version: &'a str,
    pub holo_web_sdk_version: &'a str,
    pub hc_spin_version: &'a str,
    pub package_manager: PackageManager,
    pub tryorama_version: &'a str,
    pub holo_enabled: bool,
}

pub fn scaffold_web_app_template(
    mut app_file_tree: FileTree,
    template_file_tree: &FileTree,
    app_name: &str,
    package_manager: PackageManager,
    holo_enabled: bool,
) -> ScaffoldResult<ScaffoldedTemplate> {
    let data = ScaffoldWebAppData {
        app_name,
        holochain_version: versions::HOLOCHAIN_VERSION,
        hdk_version: versions::HDK_VERSION,
        hdi_version: versions::HDI_VERSION,
        holochain_client_version: versions::HOLOCHAIN_CLIENT_VERSION,
        holo_web_sdk_version: versions::WEB_SDK_VERSION,
        hc_spin_version: versions::HC_SPIN_VERSION,
        package_manager,
        tryorama_version: versions::TRYORAMA_VERSION,
        holo_enabled,
    };

    let h = build_handlebars(template_file_tree)?;

    let field_types_path = PathBuf::from("web-app");
    let v: Vec<OsString> = field_types_path.iter().map(|s| s.to_os_string()).collect();

    if let Some(web_app_template) = template_file_tree.path(&mut v.iter()) {
        app_file_tree = render_template_file_tree_and_merge_with_existing(
            app_file_tree,
            &h,
            web_app_template,
            &data,
        )?;
    }

    let next_instructions = match file_content(
        template_file_tree,
        &PathBuf::from("web-app.instructions.hbs"),
    ) {
        Ok(content) => Some(h.render_template(content.as_str(), &data)?),
        Err(_) => None,
    };

    Ok(ScaffoldedTemplate {
        file_tree: app_file_tree,
        next_instructions,
    })
}