当前位置: 首页 > news >正文

rust从0开始写项目-读取配置文件

一个项目初始化,总是有几个元素是必不可少的、框架、日志、配置文件等等基本元素。 今天我们主要介绍下怎么获取配置并在全局使用

更多好文。vx. golang技术实验室 专注分享 golang、rust等多语言、中间件及大数据相关内容

Part1一、读取cargo.toml文件内容

Cargo.toml 文件配置如下:

[package]
name = "my_test"
version = "0.1.0"
edition = "2021"
authors = ["zhangql"]

代码:

pub fn cargo_file(){
    let name = env!("CARGO_PKG_NAME");
    let version  = env!("CARGO_PKG_VERSION");
    let authors = env!("CARGO_PKG_AUTHORS");
    println!("{name}\n {version}\n {authors}")
}

my_test
 0.1.0
 zhangql

Part2二、读取.env文件

项目根目录新建 .env 文件,写入如下代码:

DATABASE_URL=mysql://postgres:123456@localhost:3306/test

Cargo.toml 文件配置导入以下第三方库:

[dependencies]
dotenv = "0.15.0"

main.rs

use dotenv::dotenv;
use std::env;

fn main() {
    // 在访问环境变量之前检查一下,防止因读取环境变量失败导致程序恐慌。
    // 先把 dotenv 导入,然后在程序开始的地方执行 dotenv() 函数即可,这就会从当前目录或父目录中的 .env 文件中加载环境变量。
    // 如果你想指定其它路径,可以使用 crate 中提供的 from_filename 或 from_path 这两个函数。
    // 好,那么调用 dotenv() 之后为什么还要调用 ok() 方法?
    // 首先,dotenv() 返回的是 Result<PathBuf> 类型,如果返回值不使用的话,就会发出一个警告:
    // 调用 ok() 之后,会把 Result 转化为 Option,而 Option 就不会产生未使用 Result 的警告了。
    // 那么,为什么不使用 unwrap()?
    // 因为在生产环境中,你不会使用 .env 这个文件,你应该使用真实的环境变量,这时 dotenv() 函数就会加载失败,如果使用 unwrap(),那么你的程序就会停止运行。
    // 所以这里使用 ok() 的目的就是当加载 dotenv 环境文件失败的时候可以忽略错误。
    dotenv().ok();

    let database_url = env::var("DATABASE_URL").expect("DATABASE_URL 没有在 .env 文件里设置");
    
    print!("{:?}", database_url);

}

运行结果:

"mysql://postgres:123456@localhost:3306/test"

Part3三、读取自定义toml文件

项目根目录新建 config.toml 文件,写入如下代码:

[database]
url = "tcp://mysql:123456@localhost/test"

[log]
debug = true
debug_sql = false
log_root = "/tmp"

Cargo.toml 文件配置导入以下第三方库:

[dependencies]
config = "0.13.1"
toml = "0.5.9"
lazy_static = "1.4"
serde = "1.0"
serde_derive = "1.0"
use std::fs::File;
use std::io::Read;
use serde::Deserialize;
#[macro_use]
extern crate lazy_static;


pub fn read_toml(){
    let setting = Setting::default();
    println!("{:#?}",setting);
    let c = Setting::get();
    println!("{:#?}",c);

}

#[derive(Debug,Deserialize)]
pub struct Log{
    pub debug : bool,
    pub debug_sql : bool,
    pub log_root : String
}
#[derive(Debug,Deserialize)]
pub struct Database{
    pub url : String
}

#[derive(Debug,Deserialize)]
pub struct Setting{
    pub database : Database,
    pub log : Log
}

impl Default for Setting{
    fn default() -> Self {
        let file_path = "/Users/zhangql/Desktop/rust/my_test/config.toml";

        let mut file = match File::open(file_path){
            Ok(f)=> f,
            Err(e)=>panic!("error is op en config {e}")
        };

        let mut str = String::new();
        println!("{}",str);
        match file.read_to_string(&mut str) {
            Ok(s)=>s,
            Err(e)=>panic!("error read str {}",e)
        };

        toml::from_str(&str).expect("Parsing the configuration file failed")
    }
}

impl Setting{
    pub fn get<'a>()->&'a Self{
        lazy_static!{
            static ref CACHE : Setting = Setting::default();
        }
        &CACHE
    }
}
Setting {
    database: Database {
        url: "tcp://mysql:123456@localhost/test",
    },
    log: Log {
        debug: true,
        debug_sql: false,
        log_root: "/tmp",
    },
}

Setting {
    database: Database {
        url: "tcp://mysql:123456@localhost/test",
    },
    log: Log {
        debug: true,
        debug_sql: false,
        log_root: "/tmp",
    },
}

现在,CACHE变量将在首次访问Setting::get()方法时进行初始化,并且后续的调用将重复使用已初始化的值。

请注意,为了使lazy_static宏正常工作,您需要在代码的顶部添加#[macro_use] extern crate lazy_static;。这使得宏在编译时能够正确展开。

使用这种方式,您可以通过调用Setting::get()方法来获取全局的Setting实例,而无需将其作为全局变量直接暴露出来。

参考文章: https://blog.csdn.net/xiaohuihui1400/article/details/130801880

本文由 mdnice 多平台发布

相关文章:

rust从0开始写项目-读取配置文件

一个项目初始化&#xff0c;总是有几个元素是必不可少的、框架、日志、配置文件等等基本元素。 今天我们主要介绍下怎么获取配置并在全局使用 更多好文。vx. golang技术实验室 专注分享 golang、rust等多语言、中间件及大数据相关内容 Part1一、读取cargo.toml文件内容 Cargo.t…...

Docker的安装以及使用

每次安装Docker都会报一堆错&#xff0c;痛定思痛干脆自己总结一篇&#xff01;&#xff01;&#xff01; Docker的安装 卸载系统自带的旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc 获取软件最新源 sudo apt-get update 安装apt依赖包 s…...

计算机网络学习笔记(五):运输层(待更新)

目录 5.1 概述 5.1.1 TCP协议的应用场景 5.1.2 UDP协议的应用场景 5.2 三大关系 5.2.1 传输层协议和应用层协议之间的关系 5.3 用户数据报协议UDP(User Datagram Protocol) 5.3.1 UDP的特点 5.3.2 UDP的首部 5.4 传输控制协议TCP(Transmission Control Protocol) 5.…...

阿里云99元服务器40G ESSD Entry云盘、2核2G3M带宽配置

阿里云99元服务器新老用户均可以买&#xff0c;你没看错&#xff0c;老用户可以买&#xff0c;活动页面 aliyunfuwuqi.com/go/aliyun 配置为云服务器ECS经济型e实例、2核2G、3M固定带宽、40G ESSD Entry云盘&#xff0c;并且续费不涨价&#xff0c;原价99元即可续费&#xff0c…...

6个机器学习可解释性框架

1、SHAP SHapley Additive explanation (SHAP)是一种解释任何机器学习模型输出的博弈论方法。它利用博弈论中的经典Shapley值及其相关扩展将最优信贷分配与局部解释联系起来. 举例&#xff1a;基于随机森林模型的心脏病患者预测分类 数据集中每个特征对模型预测的贡献由Shap…...

数据结构——B树

文章目录 B树1. 概念2. B树插入分析3.插入过程4. B树插入实现5.B树验证6. B树性能分析7.B树&B*树8. 小结9. B树的运用MyISAMInnoDB 10. 总结 B树 可以用于查询的数据结构非常的多&#xff0c;比如说二插搜索树、平衡树、哈希表、位图、布隆过滤器&#xff0c;但如果需要存…...

java--String

1.String创建对象封装字符串数据的方式 ①方式一&#xff1a;java程序中的所有字符串文字(例如"abc")都为此类的对象 ②方式二&#xff1a;调用String类的构造器初始化字符串对象。 2.String提供的操作字符串数据的常用方法...

ls命令区别

ls -lh:显示详细信息&#xff0c;其中其中文件大小是显示Kb或Mb。 ls -l:也会显示文件大小&#xff0c;只是显示的是字节。...

经典OJ题:随机链表的复制

目录 题目&#xff1a; 本题的解图关键在于画图与看图&#xff01; 思路分析&#xff1a; 方法一&#xff1a;暴力求解法。 方法二&#xff1a;插入法 方法解析&#xff1a; 步骤一、插入 步骤二、 处理每一个copy的randdom指针⭐————重点 步骤三、拆卸节点 代码…...

HTML的初步学习

HTML HTML 描述网页的骨架, 标签化的语言. HTML 的执行是浏览器的工作,浏览器会解析 html 的内容,根据里面的代码,往页面上放东西,浏览器的工作归根结底,还是以汇编的形式在CPU上执行. 浏览器对于html语法格式的检查没有很严格,即使你写的代码有一些不合规范之处,浏览器也会尽可…...

小赢科技荣登“2023中国互联网成长型前二十家企业”,旗下小赢卡贷表现突出

近日,中国互联网协会和厦门市人民政府联合在厦门举办了中国互联网企业综合实力指数(2023)发布会暨百家企业论坛。在这次评选活动中,深圳小赢信息技术有限责任公司(以下简称:小赢科技)凭借其行业领先的技术创新、企业成长及社会责任等方面的卓越表现,被评选为“2023年中国互联网…...

@Cacheable 、 @CachePut 、@CacheEvict 注解

在 Application 类上添加注解 EnableCaching EnableCaching public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}Cacheable 注解 能够让方法的返回值被缓存起来,后续的请求可以直接从缓存中获取结果。 示…...

【ChatGPT】人工智能的下一个前沿

&#x1f38a;专栏【ChatGPT】 &#x1f33a;每日一句&#xff1a;慢慢变好,我是,你也是 ⭐欢迎并且感谢大家指出我的问题 文章目录 一、引言 二、ChatGPT的工作原理 三、ChatGPT的主要特点 四、ChatGPT的应用场景 五、结论与展望 ​​​​​​​ 一、引言 随着人工智能技…...

chrome 一些详细信息查找的地方

可以获得chrome 信息的列表 缓存 #缓存位置# 浏览器事件...

小程序游戏对接广告收益微信小游戏抖音游戏软件

小程序游戏对接广告是一种常见的游戏开发模式&#xff0c;开发者可以通过在游戏中嵌入广告来获取收益。以下是一些与小程序游戏对接广告收益相关的关键信息&#xff1a; 小程序游戏广告平台选择&#xff1a; 选择适合你的小程序游戏的广告平台非常重要。不同的平台提供不同类型…...

将MSSQL字段类型由text改为ntext

-- 修改数据字段类型DECLARE DATATYPE nvarchar(128) SET DATATYPE (SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME your-table-name AND COLUMN_NAME your-column-name) IF DATATYPE text BEGIN-- 注意 text和ntext互转要先转为中间类型ALTER TABL…...

python怎么表示复数

Python是一种强大的编程语言&#xff0c;支持许多数据类型&#xff0c;其中包括复数。本文将介绍Python中如何表示复数。 一、什么是复数 复数是由实部和虚部组成的数&#xff0c;可以表示为abj&#xff0c;其中a是实部&#xff0c;b是虚部&#xff0c;j是虚数单位。 二、Py…...

Java设计模式之迭代器模式

定义 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示。 结构 迭代器模式主要包含以下角色&#xff1a; 抽象聚合角色&#xff1a;定义存储、添加、删除聚合元素以及创建迭代器对象的接口。具体聚合角色&#xff1a;实现抽象聚合类&a…...

Qt 继承QAbstractListModel实现自定义ListModel

1.简介 QAbstractListModel是Qt框架中的一个抽象类&#xff0c;用于实现数据模型&#xff0c;用于在Qt的视图组件中展示和编辑列表数据。与QAbstractTableModel类似&#xff0c;它也是一个抽象类&#xff0c;提供了一些基本的接口和默认实现&#xff0c;可以方便地创建自定义的…...

TensorFlow2.0教程2-全连接神经网络以及深度学习技巧

文章目录 基础MLP网络1.回归任务2.分类任务mlp及深度学习常见技巧1.基础模型2.权重初始化3.激活函数4.优化器5.批正则化6.dropout基础MLP网络 1.回归任务 import tensorflow as tf import tensorflow.keras as keras import tensorflow.keras.layers as layers# 导入数据 (x_t…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...