首页 > 其他分享 >spring boot迁移计划 第Ⅰ章 --chapter 1. rust hyper 结合rust nacos-client开发nacos网关 part ③ toml配置文件

spring boot迁移计划 第Ⅰ章 --chapter 1. rust hyper 结合rust nacos-client开发nacos网关 part ③ toml配置文件

时间:2024-12-31 22:19:11浏览次数:8  
标签:配置文件 default ip Some nacos server port rust

1. toml依赖

toml = "0.8"

2. 代码

由于项目还未完成,部分配置(如数据库等)还未增加,后续更新增加

use log::info;
use serde::Deserialize;
use std::{
    fs, sync::LazyLock
};
use crate::init::constant::*;
//创建全局静态配置文件
static CONFIG: LazyLock<Config> = LazyLock::new(init_config);

//懒加载初始化,约定优于配置
fn init_config() -> Config {
    let contents =
        fs::read_to_string(CONFIG_FILE).expect("Something went wrong reading the config file");
    let mut config_input: Config =
        toml::from_str(&contents).expect(&format!("load {} file  failed", CONFIG_FILE));
    config_input.server = match config_input.server {
        None => Some(Server::default()),
        mut ser => {
            ser.as_mut().map(|server| {
                server.ip = server.ip.clone().or_else(|| Server::default().ip);
                server.port = server.port.or_else(|| Server::default().port);
                server.name = server.name.clone().or_else(|| Server::default().name);
            });
            ser
        }
    };
    config_input.nacos = match config_input.nacos {
        None => Some(Nacos::default()),
        mut nac => {
            nac.as_mut().map(|nacos| {
                nacos.ip = nacos.ip.clone().or_else(|| Nacos::default().ip);
                nacos.port = nacos.port.or_else(|| Nacos::default().port);
                nacos.group_name = nacos
                    .group_name
                    .clone()
                    .or_else(|| Nacos::default().group_name);
            });
            nac
        }
    };
    info!("init config complete");
    config_input
}

#[derive(Deserialize, Debug, Clone, PartialEq)]
pub struct Config {
    pub server: Option<Server>,
    pub nacos: Option<Nacos>,
}

#[derive(Deserialize, Debug, Clone, PartialEq)]
pub struct Server {
    pub ip: Option<String>,
    pub port: Option<u16>,
    pub name: Option<String>,
}

#[derive(Deserialize, Debug, Clone, PartialEq)]
pub struct Nacos {
    pub ip: Option<String>,
    pub port: Option<u16>,
    pub group_name: Option<String>,
}

impl Default for Config {
    fn default() -> Self {
        Self {
            server: Some(Server::default()),
            nacos: Some(Nacos::default()),
        }
    }
}

impl Default for Server {
    fn default() -> Self {
        Self {
            ip: Some(SERVER_DEFAULT_LISTEN.to_owned()),
            port: Some(SERVER_DEFAULT_PORT),
            name: Some(SERVER_DEFAULT_NAME.to_owned()),
        }
    }
}

impl Default for Nacos {
    fn default() -> Self {
        Self {
            ip: Some(LOCAL_HOST.to_owned()),
            port: Some(NACOS_DEFAULT_PORT),
            group_name: Some(NACOS_DEFAULT_GROUP.to_owned()),
        }
    }
}

impl Config {
    //获取全局引用
    pub fn global() -> &'static Config{
        &CONFIG
    }

    //下面的函数可以让我们链式调用获取属性值
    //如 let server_ip = Config::global().server_ip();
    pub fn server_ip(&self) -> String {
        match &self.server {
            None => Server::default().ip.unwrap(),
            Some(server) => match &server.ip {
                None => Server::default().ip.unwrap(),
                Some(ip) => ip.to_string(),
            },
        }
    }

    pub fn server_port(&self) -> u16 {
        match &self.server {
            None => Server::default().port.unwrap(),
            Some(server) => match server.port {
                None => Server::default().port.unwrap(),
                Some(port) => port,
            },
        }
    }

    pub fn server_name(&self) -> String {
        match &self.server {
            None => Server::default().name.unwrap(),
            Some(server) => match &server.name {
                None => Server::default().name.unwrap(),
                Some(name) => name.to_string(),
            },
        }
    }

    pub fn nacos_ip(&self) -> String {
        match &self.nacos {
            None => Nacos::default().ip.unwrap(),
            Some(nacos) => match &nacos.ip {
                None => Nacos::default().ip.unwrap(),
                Some(ip) => ip.to_string(),
            },
        }
    }

    pub fn nacos_port(&self) -> u16 {
        match &self.nacos {
            None => Nacos::default().port.unwrap(),
            Some(nacos) => match nacos.port {
                None => Nacos::default().port.unwrap(),
                Some(port) => port,
            },
        }
    }

    pub fn nacos_group(&self) -> String {
        match &self.nacos {
            None => Nacos::default().group_name.unwrap(),
            Some(nacos) => match &nacos.group_name {
                None => Nacos::default().group_name.unwrap(),
                Some(group_name) => group_name.to_string(),
            },
        }
    }
}

标签:配置文件,default,ip,Some,nacos,server,port,rust
From: https://www.cnblogs.com/jiajie6591/p/18644839

相关文章

  • spring boot迁移计划 第Ⅰ章 --chapter 1. rust hyper 结合rust nacos-client开发na
    1.toml依赖hyper={version="1",features=["full"]}tokio={version="1",features=["full"]}http-body-util="0.1"hyper-util={version="0.1",features=["full"]}2.......
  • Rust f64详解
    一、Rust中的f64类型与IEEE754双精度浮点数Rust中的f64类型是一个双精度浮点数类型,它严格遵循IEEE754双精度标准。这意味着f64类型在Rust中的存储和表示方式与IEEE754双精度浮点数完全一致。二、存储格式f64类型由64位二进制数表示,分为以下三部分:1.符号位(1位):位置:第......
  • rust学习十五.3、智能指针相关的Deref和Drop特质
     一、前言智能指针为什么称为智能指针?大概因为它所包含的额外功能。这些额外的功能使得编码或者运行时让指针看起来更有效、并体现某些“智”的特征,所以,我猜测这应该是rust发明人这么称呼此类对象为智能的原因。 据前面有关章节所述,我们知道智能指针多基于结构体(struct)扩......
  • 使用expect复制系统配置文件压缩打包上传到其他服务器上面
    #!/bin/bashhost="192.168.0.111"username="root"password="niway"#cp/etc/inittab/usr/local/tmp/#用于系统初始化,定义了系统的运行级别。cp/etc/fstab/usr/local/tmp/#定义了需要在启动时自动挂载的文件系统。cp/etc/hosts/usr/local/tmp/#定义了主机名与IP地址的映射。cp......
  • Midjourney 官方用户端更新 · 基础介绍 · 多重个性化配置文件与情绪版
    MidJourney又更新了,更新了啥呐?官方称之为“多重个性化配置文件与情绪板”,在我写这个开头的时候,已经测试了一下午,一直考虑要不要写这篇,这个对新手不友好,且这个个性化基础架构还是早期版本…最后想了想还是有必须要写的,因为根据这几天更新的东西,我隐隐有些猜测,世界工具+个......
  • [rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(00):iced简单窗口的实现以及在窗口显
    前言本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。本合集是基于新版本的关于分部件(widget)的使用介绍,包括源代码介绍、实例使用等。环境配置系统:window10平台:visualstudiocode语言:rust......
  • 【Rust自学】8.6. HashMap Pt.2:更新HashMap
    8.6.0.本章内容第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构,这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。第八章中的集合是存储在堆内存上而非栈内存上的,这也意味着这些集合的数据大小无需在编译时就确定,在运行时它们......
  • 【Rust自学】8.4. String类型 Pt.2:字节、标量值、字形簇以及字符串的各类操作
    8.4.0.本章内容第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构,这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。第八章中的集合是存储在堆内存上而非栈内存上的,这也意味着这些集合的数据大小无需在编译时就确定,在运行时它们......
  • 【Rust自学】5.2. struct使用例(加打印调试信息)
    对不起我都写到第8章了才发现我忘记发这一篇了,现在补上,不过这可能导致专栏的文章顺序有一点问题,但也只能将就着了。喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)5.2.1.例子需求创建一个函数,计算长方形的面积,长......
  • Rust中以下三个东西是什么?有什么用? #[automatically_derived] #[allow(clippy::ptr_ar
    Rust中以下三个东西是什么?有什么用?#[automatically_derived]#[allow(clippy::ptr_arg)]#[rustfmt::skip]gpttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt在Rust中,以下三个属性分别有不同的用途:1.#[automatically_derived]作用:这个属性表示该代码是由......