ruwebframe 0.1.3

a simple webframe for rust actix-web, based on rudi and rbatis.
Documentation
use crate::rubase::rutils::fileutils;
use crate::rubase::{BaseEntity, ruentity, rutils, BaseEntitySingle};
use crate::rucfg;
use crate::rudi::didto;
use crate::rudi::didto::StructInfo;
use crate::rudi::difactroy::ruast;
use crate::rudi::ditemplate::parsetemplate;
use crate::rulog::rulog;
use serde::{Deserialize, Serialize};
use std::io;
use std::sync::{  Mutex};


#[derive(Debug, Default, Serialize, Deserialize)]
pub struct DiFactroy {
    pub notShowExist: bool,
    pub template: Mutex<String>,
    pub structs: Mutex<Vec<didto::StructInfo>>,

}

impl BaseEntitySingle for DiFactroy {}

impl DiFactroy {
    pub fn new() -> DiFactroy {
        ///rulog::info2("new DiFactroy,ii={}","1");
        DiFactroy {
            ..Default::default()
        }
    }

    pub fn FindBasePkg() -> String {
        return String::new();
    }

    pub fn FindFileStruct(filePath: String) -> didto::structinfo::StructInfo {
        let ret = fileutils::read_file(filePath.as_str());

        let ifSingle = false;
        for line in ret.unwrap().as_str().split("\n") {}
        StructInfo::default()
    }

    // 创建文件_init.rs
    pub fn CreateInit() -> String {
        //if
        return String::new();
    }
    pub fn CreateInitForce() -> String {
        return String::new();
    }

    pub fn list_all_files(dir: &str) -> Vec<String> {
        fileutils::list_rs_files(dir)
    }
    pub fn read_file(file_name: &str) -> Result<String, io::Error> {
        fileutils::read_file(file_name)
    }
    pub fn parse_all_files(&self, dir: &str) {
        let ua = ruast::RuAst::new();
        let mut results = Vec::<didto::StructInfo>::new();
        for f in fileutils::list_rs_files(dir) {
            let content = fileutils::read_file(f.as_str()).unwrap();
            let v = ua.find_entity_all(f.as_str(), content.as_str());
            results.extend(v);
        }
        *self.structs.lock().unwrap() = results;
    }
    pub fn fill_template(&self) {
        if self.template.lock().unwrap().len() > 0 {
            return;
        }
        let mut template = parsetemplate::ParseTemplate::parse_template_file();
        *self.template.lock().unwrap() = template;
        rulog::info2("fill_template:\r\n", self.template.lock().unwrap().as_str());
    }
    pub fn build_init(&self, stru: &didto::StructInfo) -> String {
        let mut template_str = self.template.lock().unwrap().clone();
        if stru.ifSingle {
            template_str = template_str.replace("{{register_singleton}}", "register_singleton");
        } else {
            template_str = template_str.replace("{{register_singleton}}", "register");
        }
        template_str = template_str.replace("{{StructInfo}}", stru.to_json().as_str());
        template_str = template_str.replace("{{RuSingle}}", stru.structName.as_str());
        template_str =
            template_str.replace("{{rusingle}}", stru.structName.to_lowercase().as_str());
        template_str = template_str.replace(
            "{{SINGLE_BEAN_NAME}",
            stru.build_single_bean_name().as_str(),
        );
        template_str = template_str.replace("{{StructPkg}}", stru.structPkg.as_str());
        let cfg = rucfg::find_bean_ruconfig().unwrap().read();
        template_str = template_str.replace("{{Corp}}", cfg.software.corp.as_str());
        template_str = template_str.replace("{{Author}}", cfg.software.author.as_str());
        template_str = template_str.replace("{{Now}}", rutils::local_now2str().as_str());
        if stru.ifDefault {
            template_str = template_str.replace("::new", "::default");
        }
        rulog::info2("build_init template_str:\r\n", template_str.as_str());
        template_str
    }
    pub fn create_init(&self, initFile: &str, content: String) -> Result<String, io::Error> {
        let ret = fileutils::write_file(initFile, content.as_str());
        rulog::info2("create_init:===", initFile);
        ret
    }

    pub fn make_di_if_force(&self, dir: &str, if_force: bool) {
        self.fill_template();
        rulog::info2("make_di_all if_force:", if_force.to_string().as_str());
        let mut ret = self.parse_all_files(dir);
        for stru in self.structs.lock().unwrap().iter() {
            if stru.existIniFile && !if_force {
                rulog::info2(
                    "struct already existIniFile gen! structName: ",
                    stru.structName.as_str(),
                );
                continue;
            }
            if stru.existIniFile && if_force {
                rulog::info2(
                    "struct already existIniFile gegen force! : ",
                    stru.structName.as_str(),
                );
            }
            rulog::info2("struct file:===", stru.to_json().as_str());
            let ini_pathfile = stru.build_struct_ini_pathfile();
            rulog::info2("ini_pathfile:===", ini_pathfile.as_str());
            let content = self.build_init(stru);
            self.create_init(&ini_pathfile, content);
            let mut stru = stru.clone();
            self.edit_mod(&mut stru);
        }
    }

    pub fn make_di_one_force(&self, dir: &str, struName: &str, if_force: bool) {
        self.fill_template();
        rulog::info2("make_di_all if_force:", if_force.to_string().as_str());
        let mut ret = self.parse_all_files(dir);
        for stru in self.structs.lock().unwrap().iter() {
            if stru.existIniFile && !if_force {
                rulog::info2(
                    "struct already existIniFile gen! structName: ",
                    stru.structName.as_str(),
                );
                continue;
            }
            if !stru.structName.as_str().eq(struName) {
                continue;
            }
            let ini_pathfile = stru.build_struct_ini_pathfile();
            rulog::info2("ini_pathfile:===", ini_pathfile.as_str());
            let content = self.build_init(stru);
            self.create_init(&ini_pathfile, content);
            let mut stru = stru.clone();
            self.edit_mod(&mut stru);
            break;
        }
    }
    pub fn make_di_one(&self, struName: &str) {
        self.make_di_one_force("./src", struName, false);
    }
    pub fn make_di_one_dir(&self, dir: &str, struName: &str) {
        self.make_di_one_force(dir, struName, false);
    }
    pub fn make_di_pkg(&self, pkgName: &str) {
        self.make_di_all("./src");
    }
    pub fn make_di(&self) {
        println!("make_di_all:*** current_dir *** {}",fileutils::current_dir().unwrap().to_str().unwrap());
        rulog::info2("current_dir:",fileutils::current_dir().unwrap().to_str().unwrap());
        self.make_di_all("./src");
    }
    pub fn make_di_all(&self, dir: &str) {
        self.make_di_if_force(dir, false);
    }
    pub fn make_di_force(&self, dir: &str) {
        self.make_di_if_force(dir, true);
    }

    pub fn list_di_all(&self, dir: &str) {
        //self.fill_template();
        let ret = self.parse_all_files(dir);
        for stru in self.structs.lock().unwrap().iter() {
            rulog::info2("struct name:===", stru.structName.as_str());
        }
    }
    pub fn list_di(&self) {
        //self.fill_template();
        self.list_di_all("./src");
    }

    pub fn list_di_pkg(&self, pkgName: &str) {
        //self.fill_template();
        self.list_di_all("./src");
    }
    pub fn unmake_di_one(&self, dir: &str, struName: &str) {
        // unmake_di_one
        // unmake mod.rs
        // self.make_di_one_force(dir, struName, false);
    }
    pub fn edit_mod(&self, stru: &mut didto::StructInfo) {
        let mod_file = stru.build_struct_mod_file();
        let content = fileutils::read_file(mod_file.as_str()).unwrap();
        rulog::info2("mod_file:===", mod_file.as_str());
        let content = stru.parse_mod_content(&content);
        fileutils::write_file(mod_file.as_str(), content.as_str());
    }
}