ruwebframe 0.1.7

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

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

fn clone_mutex_string(m: &Mutex<String>) -> Mutex<String> {
    Mutex::new(m.lock().unwrap().clone())
}

fn clone_mutex_vec(m: &Mutex<Vec<didto::StructInfo>>) -> Mutex<Vec<didto::StructInfo>> {
    Mutex::new(m.lock().unwrap().clone())
}

impl BaseEntitySingle for DiFactroy {}

impl DiFactroy {
    pub fn new() -> DiFactroy {
        DiFactroy {
            ..Default::default()
        }
    }
    pub fn new_mutex() -> Mutex<DiFactroy> {

        Mutex::new(DiFactroy {
            ..Default::default()
        })
    }

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

    pub fn FindFileStruct(filePath: String) -> didto::struct_info::StructInfo {
        let ret = file_utils::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> {
        file_utils::list_rs_files(dir)
    }
    pub fn read_file(file_name: &str) -> Result<String, io::Error> {
        file_utils::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 file_utils::list_rs_files(dir) {
            let content = file_utils::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(&mut self) {
        if self.template.len() > 0 {
            return;
        }
        let template = parse_template::ParseTemplate::parse_template_file();

        self.template=String::from(template);        ru_log::info2("fill_template:\r\n", self.template.as_str());
    }
    pub fn fill_template_suite(&self) {
        if self.template_suite.lock().unwrap().len() > 0 {
            return;
        }
        let template = parse_template::ParseTemplate::parse_template_suite();
        *self.template_suite.lock().unwrap() = template;
        ru_log::info2(
            "template_suite:\r\n",
            self.template_suite.lock().unwrap().as_str(),
        );
    }
    pub fn build_init(&self, stru: &didto::StructInfo) -> String {
        let mut template_str = self.template.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().unwrap().as_str());
        template_str = template_str.replace("{{RuSingle}}", stru.structName.as_str());
        template_str =
            template_str.replace("{{rusingle}}", stru.structName.to_snake_case().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_ru_config().unwrap().lock().unwrap().read_clone().clone();
        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");
        }
        ru_log::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 = file_utils::write_file(initFile, content.as_str());
        ru_log::info2("create_init:===", initFile);
        ret
    }
    pub fn build_suite(&self, stru: &didto::StructInfo) -> String {
        let mut template_str = self.template_suite.lock().unwrap().clone();

        template_str
    }
    pub fn create_suite(&self, initFile: &str, content: String) -> Result<String, io::Error> {
        let ret = file_utils::write_file(initFile, content.as_str());
        ru_log::info2("create_init:===", initFile);
        ret
    }
    pub fn make_di_if_force(&mut self, dir: &str, if_force: bool) {
        self.fill_template();
        ru_log::info2("make_di_if_force:", if_force.to_string());
        let _retret = self.parse_all_files(dir);
        let l=self.structs.lock();
        for stru in l.unwrap().iter() {
            if stru.existIniFile && !if_force {
                ru_log::info2(
                    "struct already existIniFile gen! structName: ",
                    stru.structName.as_str(),
                );
                continue;
            }
            if stru.existIniFile && if_force {
                ru_log::info2(
                    "struct already existIniFile gegen force! : ",
                    stru.structName.as_str(),
                );
            }
            let ini_pathfile = stru.build_struct_ini_pathfile();
            let content = self.build_init(stru);
            let ret = self.create_init(&ini_pathfile, content);
            if ret.is_err() {
                continue;
            }
            let mut stru = stru.clone();
            let ret = self.edit_mod(&mut stru);
            if ret.is_err() {
                println!("{}", ret.err().unwrap());
            }
        }
    }

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

    pub fn list_di_all(&self, dir: &str) {
        //self.fill_template();
        let _retret = self.parse_all_files(dir);
        for stru in self.structs.lock().unwrap().iter() {
            ru_log::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();
        println!("pkgName: {}", pkgName);
        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) -> Result<String, io::Error> {
        let mod_file = stru.build_struct_mod_file();
        let content = file_utils::read_file(mod_file.as_str()).unwrap();
        ru_log::info2("mod_file:===", mod_file.as_str());
        let content = stru.parse_mod_content(&content);
        file_utils::write_file(mod_file.as_str(), content.as_str())
    }
    pub fn edit_mod_suite(&self, stru: &mut didto::StructInfo) -> Result<String, io::Error> {
        let mod_file = stru.build_struct_mod_file();
        let content = file_utils::read_file(mod_file.as_str()).unwrap();
        ru_log::info2("mod_file:===", mod_file.as_str());
        let content = stru.parse_mod_content_suite(&content);
        file_utils::write_file(mod_file.as_str(), content.as_str())
    }

    pub fn get_self(&self) -> &Self {
        return self;
    }
    pub fn get_structs(&self) -> Vec<didto::StructInfo> {
        return self.structs.lock().unwrap().clone();
    }
    pub fn get_template(&self) -> String {
        return self.template.clone();
    }

    pub fn make_di_force_one(&mut self, struName: &str) {
        self.make_di_one_force("./src", struName, true);
    }
    pub fn make_suite(&self, struName: &str) {
        self.make_di_suite("./src", struName)
    }
    pub fn make_di_suite(&self, dir: &str, struName: &str) {
        self.make_di_one_suite(dir, struName, false)
    }
    pub fn make_di_suites(&self, dir: &str ) {
        self.make_di_all_suite(dir,   false)
    }
    pub fn make_suites(&self ) {
        self.make_di_suites("./src" )
    }
    pub fn make_di_one_suite(&self, dir: &str, struName: &str, if_force: bool) {
        // self.fill_template();
        self.fill_template_suite();
        ru_log::info2("make_di_one_suite if_force:", if_force.to_string().as_str());
        let _retret = self.parse_all_files(dir);
        for stru in self.structs.lock().unwrap().iter() {
            if !stru.structName.as_str().eq(struName) {
                continue;
            }
            if stru.existSuiteFile && !if_force {
                ru_log::info2(
                    "struct already existSuiteFile gen! structName: ",
                    stru.structName.as_str(),
                );
                continue;
            }
            let suite_file = stru.build_struct_suite_pathfile();
            ru_log::info2("suite_file:===", suite_file.as_str());
            let content = self.build_suite(stru);
            let ret = self.create_suite(&suite_file, content);
            if ret.is_err() {
                continue;
            }
            let mut stru = stru.clone();
            let _ret = self.edit_mod_suite(&mut stru);
            break;
        }
    }

    pub fn make_di_all_suite(&self, dir: &str,  if_force: bool) {
        
        self.fill_template_suite();
        ru_log::info2("make_di_one_suite if_force:", if_force.to_string().as_str());
        let _retret = self.parse_all_files(dir);
        for stru in self.structs.lock().unwrap().iter() {
           
            if stru.existSuiteFile && !if_force {
                ru_log::info2(
                    "struct already existSuiteFile gen! structName: ",
                    stru.structName.as_str(),
                );
                continue;
            }
            let suite_file = stru.build_struct_suite_pathfile();
            ru_log::info2("create suite_file:===> ", suite_file.as_str());
            let content = self.build_suite(stru);
            let ret = self.create_suite(&suite_file, content);
            if ret.is_err() {
                continue;
            }
            let mut stru = stru.clone();
            let _ret = self.edit_mod_suite(&mut stru);
           
        }
    }
}