当前位置: 首页 > 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…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...