ruwebframe 0.1.3

a simple webframe for rust actix-web, based on rudi and rbatis.
Documentation
use crate::rubase::{BaseEntitySingle, rudto, ruentity, BaseEntity, rutils};

use crate::rubase::ruconst::ruconst;
use crate::rubase::rudto::cfgdto;

use crate::rucfg;
use crate::rulog::rulog;
use serde::Deserialize;
use spicex::Spice;
use std::fs::File;
use std::io::{BufRead, BufReader, Read};
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, Mutex, MutexGuard};
use crate::rubase::getself::GetSelf;
use crate::rubase::rudto::cfgdto::CfgDto; 
pub fn ifDev() -> bool {
    findEnv() == "dev"
}
pub fn ifTest() -> bool {
    findEnv() == "test"
}
pub fn ifMaster() -> bool {
    findEnv() == "prod" || findEnv() == "master"
}

pub fn ifNotMaster() -> bool {
    !ifMaster()
}

pub fn findEnv() -> String {
    rucfg::find_bean_ruconfig().unwrap().readEnv()
}

#[derive(Debug, serde::Serialize, Deserialize)]
pub struct RuConfig {
    parsed: AtomicBool,
    pub config: Arc<Mutex<CfgDto>>,
}
impl  BaseEntity for RuConfig {}
impl RuConfig {
    pub fn new() -> Self {
        let rucfg = Self {
            parsed: AtomicBool::new(false),
            config: Arc::new(Mutex::new(cfgdto::CfgDto::default())),
        };
        rucfg.parse_config();
        rucfg
    }
    pub fn get_config(&self,file:String )-> String {
        let mut  cfgdir=rutils::find_base_path();
        cfgdir.push_str("/config/");
        cfgdir.push_str( file.as_str()) ;
        cfgdir
    }
    pub fn parse_config(&self) {

        let envFile =self.get_config(self.parse_env2file());
        let file = File::open(&envFile);
        rulog::info2("f:", envFile.as_str());
        let mut read = BufReader::new(file.unwrap());
        let mut yaml_str = String::new();
        read.read_to_string(&mut yaml_str).unwrap();
        println!("yaml_str:{:#?}", yaml_str);
        let ret = serde_yaml::from_str::<cfgdto::cfgdto::CfgDto>(&yaml_str);

        // ✅ 显式指定类型
        println!("ret:{:#?}", ret);
        if let Ok(config) = ret {
            let mut guard = self.config.lock().unwrap(); // 获取写锁
            *guard = config;
            guard.parse_env_var();
        } else {
            rulog::error("parse config failed");
        }
        self.parsed.store(true, Ordering::Relaxed);
    }
    pub fn read(&self) -> cfgdto::CfgDto {
        self.readCfg().clone()
    }
    pub fn readCfg(&self) -> MutexGuard<'_, cfgdto::CfgDto> {
        self.config.lock().unwrap()
    }
    pub fn readEnv(&self) ->  String {
         self.get_self().software.env
    }

    pub fn parse_env2file(&self) -> String {
        let env_file = self.parse_env();

        let filename =  String::from(   "/ichub-" ) + &rucfg::parsecfg::parse_env_var(env_file) + ".yml";
        rulog::info2("filename:", filename.as_str());

        return filename;
    }
    pub fn parse_env(&self) -> String {
        let mut spice = Spice::new();
        spice.set_config_file(rutils::find_base_path()+ruconst::FILE_PATH_ENV).unwrap();
        let env = spice.get_string("Env").unwrap();

        return env.unwrap();
    }
    pub fn read2json(&self) -> String {
        self.read().to_json()
    }
    pub fn get_self(&self) ->  cfgdto::CfgDto {
        self.readCfg().get_self()
    }

}