cream-js 0.1.0

A lightweight compiler for modern web applications.
mod component;
mod consts;
mod config;
mod helpers;
mod input;
mod javascript_lib;
mod make;
mod transpiler;
mod std_err;
mod create_project;
mod out;
mod pass;
mod serve;

use notify::{Event, EventKind, RecursiveMode, Watcher};
use crate::consts::{CONFIG_FILE};
use crate::helpers::version::version;
use crate::create_project::create_project;
use crate::pass::pass;
use crate::serve::serve;
use crate::std_err::ErrType::{NotFound, SyntaxError};
use crate::std_err::StdErr;
use std::env;
use std::fs::read_to_string;
use std::path::Path;
use std::process::exit;

#[tokio::main]
async fn main() {
    let args = env::args().collect::<Vec<String>>();

    if args.len() == 1 {
        let ne = "cream new {project_name}: Create a new project";
        let build = "cream make: Build your project";
        let serve = "cream serve: Serve or run your project";
        let vers = "cream version: Output's cream's version that is currently installed";

        let inst = format!("{ne}\n{build}\n{serve}\n{vers}");
        println!("{inst}");
    } else {
        let mut config;

        match args[1].as_str() {
            "new" => create_project(args.get(2).expect("Project name not provided")),
            "make" | "serve" => {
                config = toml::from_str(
                    &read_to_string(CONFIG_FILE)
                        .unwrap_or_else(|_| {
                            StdErr::exec(NotFound, CONFIG_FILE);
                            exit(1)
                        })
                ).unwrap_or_else(|e| {
                    StdErr::exec(
                        SyntaxError,
                        &format!("config file contains invalid toml: {}", e)
                    );
                    exit(1)
                });

                if !cfg!(debug_assertions) || args[1].as_str() == "make" {
                    make::make(&mut config);
                }

                if args[1].as_str() == "serve" {
                    let bind_conf = config.clone();
                    let mut watcher = notify::recommended_watcher
                        (move |event: Result<Event, notify::Error>| {
                            if let Ok(event) = event {
                                match event.kind {
                                    EventKind::Create(_) |
                                    EventKind::Remove(_) |
                                    EventKind::Modify(_) => {
                                        std::thread::sleep(
                                            std::time::Duration::from_millis(300)
                                        );
                                        println!("Building...");
                                        make::make(&bind_conf);
                                    },
                                    _ => {}
                                }
                            }
                        }).unwrap();

                    let _ = watcher.watch(
                        Path::new("./src").as_ref(),
                        RecursiveMode::Recursive
                    );

                    let bind_conf = config.clone();
                    serve(&bind_conf).await
                }
            },
            "version" => println!("{}", version()),
            &_ => pass(),
        }
    }
}