holochain_scaffolding_cli 0.0.2

CLI to easily generate and edit holochain apps
Documentation
use build_fs_tree::{dir, file};
use std::{ffi::OsString, path::PathBuf};

use crate::error::ScaffoldResult;
use crate::{error::ScaffoldError, file_tree::FileTree};

use self::uis::{choose_ui_framework, scaffold_web_app_ui, UiFramework};

use super::{
    app::{
        cargo::workspace_cargo_toml,
        default_nix::default_nix,
        gitignore::gitignore,
        manifests::{empty_happ_manifest, web_happ_manifest},
    },
    tryorama::{package_json::tryorama_package_json, tsconfig_json::tryorama_tsconfig},
};

mod package_json;
pub mod uis;

use package_json::workspace_package_json;

fn web_app_skeleton(
    app_name: String,
    description: Option<String>,
    skip_nix: bool,
    ui_framework: &UiFramework,
) -> ScaffoldResult<FileTree> {
    let mut app_file_tree = dir! {
      ".gitignore" => file!(gitignore())
      "workdir" => dir!{
        "happ.yaml" => file!(empty_happ_manifest(app_name.clone(), description)?)
        "web-happ.yaml" => file!(web_happ_manifest(app_name.clone(), format!("./{}.happ", app_name), String::from("../ui/dist.zip"))?)
      }
      "package.json" => file!(workspace_package_json(&app_name, &String::from("ui"), &String::from("workdir"), &String::from("workdir")))
      "tests" => dir!{
        "package.json" => file!(tryorama_package_json())
        "tsconfig.json" => file!(tryorama_tsconfig())
        "src" => dir! {}
      }
      "Cargo.toml" => file!(workspace_cargo_toml())
      "dnas" => dir! {}
    };

    if !skip_nix {
        app_file_tree
            .dir_content_mut()
            .ok_or(ScaffoldError::PathNotFound(PathBuf::new()))?
            .insert(OsString::from("default.nix"), default_nix());
    }

    let mut app_file_tree = scaffold_web_app_ui(app_file_tree, ui_framework, &app_name)?;

    app_file_tree
        .dir_content_mut()
        .unwrap()
        .insert(OsString::from("dnas"), dir! {});

    Ok(app_file_tree)
}

pub fn scaffold_web_app(
    app_name: String,
    description: Option<String>,
    skip_nix: bool,
    ui_framework: &Option<UiFramework>,
) -> ScaffoldResult<FileTree> {
    let ui = match ui_framework {
        Some(ui) => ui.clone(),
        None => choose_ui_framework()?,
    };

    Ok(dir! {
      app_name.clone() => web_app_skeleton(app_name, description, skip_nix, &ui)?
    })
}