rust - 从功能获得的mod中获取结构

标签 rust

我如何从函数结果的mod中共享结构,以便每次我需要环境变量时都不会重新运行env::get()函数。
src/main:

mod env;

async fn main() {
    println!("{}", env::get().profile);
    println!("{}", env::get().redis);
}
src/env:
use serde::Deserialize;
extern crate dotenv;

#[derive(Deserialize, Debug)]
pub struct Config {
    pub redis: String,
    pub profile: String,
}

pub fn get() -> Config {
    dotenv::dotenv().expect("Failed to read .env file");

    let env = match envy::from_env::<Config>() {
        Ok(config) => config,
        Err(e) => panic!("{:#?}", e),
    };

    env
}

如果我按照mccarton的建议使用lazy_static,如何在main中获取ENV?
src/env:
 use serde::Deserialize;
    extern crate dotenv;
    
#[derive(Deserialize, Debug)]
pub struct Config {
    pub redis: String,
    pub profile: String,
}

pub fn get() -> Config {
    dotenv::dotenv().expect("Failed to read .env file");

    let env = match envy::from_env::<Config>() {
        Ok(config) => config,
        Err(e) => panic!("{:#?}", e),
    };

    env
}

lazy_static! {
    static ref ENV: Config = {
        dotenv::dotenv().expect("Failed to read .env file");

        let env = match envy::from_env::<Config>() {
            Ok(config) => config,
            Err(e) => panic!("{:#?}", e),
        };

        env
    };
}

最佳答案

这里是:

use serde::Deserialize;
extern crate dotenv;

#[derive(Deserialize, Debug)]
pub struct EnvConfig {
    pub redis: String,
    pub profile: String,
}

lazy_static! {
    pub static ref ENV: EnvConfig = {
        dotenv::dotenv().expect("Failed to read .env file");

        let env = match envy::from_env::<EnvConfig>() {
            Ok(config) => config,
            Err(e) => panic!("{:#?}", e),
        };

        env
    };
}

pub fn get() -> &'static ENV {
    &ENV
}

关于rust - 从功能获得的mod中获取结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62981701/

相关文章:

rust - const fn 与内联属性

rust - 无法修改rp2040上的外设寄存器

rust - 如何使用 wasm-bindgen 调用作为模块的 JavaScript 函数?

Rust,2 个具有重叠私有(private)函数的 crate

rust - 以不同于其 JSON 键的方式格式化结构字段

计算并生成重复结构字段的 Rust 宏

rust - transmute::< &'a Arc<T>, &' a Weak<T>>(...) 是否安全?

performance - 从 if 语句提前返回或从这两种情况返回之间有区别吗?

rust - 无法定义适当的防 rust 生命周期要求

rust - Rust 中的元组和数组有什么区别?