solana-spinup 0.2.0

A spinup tool that scaffolds a solana project alongside its base dependencies
Documentation
use std::{fs, env};
use std::process::Command;
use std::path::Path;

pub fn add_program(name: &String) {
    let new_program = Path::new(name);
    let src = new_program.join("src");
    let current_dir = env::current_dir().unwrap();

    fs::create_dir_all(&new_program).unwrap();
    fs::create_dir_all(&src).unwrap();

    let cargo_toml_content  = format!(r#"[package]
    name = "{}"
    version = "0.1.0"
    edition = "2021"
    
    [dependencies]
    solana-program="1.9.0"
    "#, name);


    let script = format!(
        r#"
    #! /bin/bash
    
    SOLANA_PROGRAMS=("program", "{}")
    
    case $1 in
        "reset")
            rm -rf ./node_modules
            for x in $(solana program show --programs | awk 'RP==0 {{print $1}}'); do 
                if [[ $x != "Program" ]]; 
                then 
                    solana program close $x;
                fi
            done
            for program in "${{SOLANA_PROGRAMS[@]}}"; do
                cargo clean --manifest-path=./$program/Cargo.toml
            done
            rm -rf dist/program
            ;;
        "clean")
            rm -rf ./node_modules
            for program in "${{SOLANA_PROGRAMS[@]}}"; do
                cargo clean --manifest-path=./$program/Cargo.toml
            done;;
        "build")
            for program in "${{SOLANA_PROGRAMS[@]}}"; do
                cargo build-bpf --manifest-path=./$program/Cargo.toml --bpf-out-dir=./dist/program
            done;;
        "deploy")
            for program in "${{SOLANA_PROGRAMS[@]}}"; do
                cargo build-bpf --manifest-path=./$program/Cargo.toml --bpf-out-dir=./dist/program
                solana program deploy dist/program/$program.so
            done;;
        "reset-and-build")
            rm -rf ./node_modules
            for x in $(solana program show --programs | awk 'RP==0 {{print $1}}'); do 
                if [[ $x != "Program" ]]; 
                then 
                    solana program close $x; 
                fi
            done
            rm -rf dist/program
            for program in "${{SOLANA_PROGRAMS[@]}}"; do
                cargo clean --manifest-path=./$program/Cargo.toml
                cargo build-bpf --manifest-path=./$program/Cargo.toml --bpf-out-dir=./dist/program
                solana program deploy dist/program/$program.so
            done
            npm install
            solana program show --programs
            ;;
    esac
    "#,
        name
    );
        
    fs::write(new_program.join("Cargo.toml"), cargo_toml_content.as_str()).unwrap();
    fs::write(src.join("lib.rs"), "").unwrap();
    fs::write(current_dir.join("cicd.sh"), script).unwrap();

    Command::new("cargo")
            .arg("build")
            .current_dir(new_program)
            .status()
            .expect("Failed to run cargo build");

    println!("Program {} added!", name)
}