Rust:如何在运行时读取配置文件并将其存储在可跨线程访问的全局结构中?

这是我在Rust中的第一个项目,我想我缺少一些简单的东西。

我试图创建一个简单的Web API守护程序,该守护程序将接收JSON的POST,解析JSON并使用配置文件中提供的凭据发送电子邮件。 90%的问题都很容易。 我正在努力与“在运行时解析配置文件”。

我已经成功使用hyper和letter来接收JSON和发送电子邮件。 但是我希望这个守护进程可以在服务器上配置,而不是在构建时配置(就像大多数Linux / Unix守护进程一样)。 我一直在这里努力工作。

我创建了一个配置模块,声明了一个结构,并使用了lazy_static!{}来存储配置结构的初始版本。

我认为我已将问题归结为一个核心问题:如何读取和解析配置文件,然后将值克隆到结构中? 特别要考虑以下事实:在运行时无法知道这些值的大小...

例如src/config.rs

use std::sync::RwLock;
use serde::Deserialize;
use std::fs;
use std::io::prelude::*;

#[derive(Debug, Deserialize, Clone, Copy)]
pub struct RimfireCfg {
    pub verbose: u8,

    /* web api server config */
    pub listen_address: &'static str,

    /* mail server config */
    pub mailserver: &'static str,
    pub port:                u16,
    pub user:       &'static str,
    pub password:   &'static str,
}

lazy_static! {
    pub static ref CONFIG: RwLock<RimfireCfg> = RwLock::new(
        RimfireCfg {
            verbose: 0,
            listen_address: "127.0.0.1:3000",
            mailserver: "smtp-mail.outlook.com",
            port: 587,
            user: "",
            password: "",
        }
    );
}

impl RimfireCfg {
    pub fn init() -> Result<(), i32> {
        let mut w = CONFIG.write().unwrap();

        /* read the config file */
        let _lcfg: RimfireCfg =
            toml::from_slice(&fs::read("rimfire.toml").unwrap()).unwrap();

        // this is clearly wrong ...
        *w.listen_address = _lcfg.listen_address.clone();
        dbg!(*w);

        Ok(())
    }

    pub fn clone_config() -> RimfireCfg {
        let m = CONFIG.read().unwrap();

        *m
    }
}

src/main.rs :

#[macro_use]
extern crate lazy_static;

mod config;

use config::RimfireCfg;

fn main() {
    let a = RimfireCfg::clone_config();

    dbg!(a);

    RimfireCfg::init().unwrap();

    let a = RimfireCfg::clone_config();

    dbg!(a);
}

有什么想法吗? 建议?

相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页