Rust讀取配置文件的實(shí)現(xiàn)步驟
1. 讀取Cargo.toml文件
Cargo.toml 文件配置如下:
[package] name = "axum" version = "0.1.0" authors = ["chh <1400152400@qq.com>"] edition = "2021"
main.rs
fn main() {
let name = env!("CARGO_PKG_NAME");
let version = env!("CARGO_PKG_VERSION");
let author = env!("CARGO_PKG_AUTHORS");
println!("{} {} {}", &name, &version, &author);
}
運(yùn)行結(jié)果:
axum 0.1.0 chh <1400152400@qq.com>
2. 讀取.env文件
項(xiàng)目根目錄新建 .env 文件,寫入如下代碼:
DATABASE_URL=mysql://postgres:123456@localhost:3306/test
Cargo.toml 文件配置導(dǎo)入以下第三方庫(kù):
[dependencies] dotenv = "0.15.0"
main.rs
use dotenv::dotenv;
use std::env;
fn main() {
// 在訪問環(huán)境變量之前檢查一下,防止因讀取環(huán)境變量失敗導(dǎo)致程序恐慌。
// 先把 dotenv 導(dǎo)入,然后在程序開始的地方執(zhí)行 dotenv() 函數(shù)即可,這就會(huì)從當(dāng)前目錄或父目錄中的 .env 文件中加載環(huán)境變量。
// 如果你想指定其它路徑,可以使用 crate 中提供的 from_filename 或 from_path 這兩個(gè)函數(shù)。
// 好,那么調(diào)用 dotenv() 之后為什么還要調(diào)用 ok() 方法?
// 首先,dotenv() 返回的是 Result<PathBuf> 類型,如果返回值不使用的話,就會(huì)發(fā)出一個(gè)警告:
// 調(diào)用 ok() 之后,會(huì)把 Result 轉(zhuǎn)化為 Option,而 Option 就不會(huì)產(chǎn)生未使用 Result 的警告了。
// 那么,為什么不使用 unwrap()?
// 因?yàn)樵谏a(chǎn)環(huán)境中,你不會(huì)使用 .env 這個(gè)文件,你應(yīng)該使用真實(shí)的環(huán)境變量,這時(shí) dotenv() 函數(shù)就會(huì)加載失敗,如果使用 unwrap(),那么你的程序就會(huì)停止運(yùn)行。
// 所以這里使用 ok() 的目的就是當(dāng)加載 dotenv 環(huán)境文件失敗的時(shí)候可以忽略錯(cuò)誤。
dotenv().ok();
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL 沒有在 .env 文件里設(shè)置");
print!("{:?}", database_url);
}
運(yùn)行結(jié)果:
"mysql://postgres:123456@localhost:3306/test"
3. 讀取自定義toml文件
項(xiàng)目根目錄新建 config.toml 文件,寫入如下代碼:
[database] url = "postgres://postgres:123456@localhost/test" [log] debug = true debug_sql = false log_root = "/tmp"
Cargo.toml 文件配置導(dǎo)入以下第三方庫(kù):
[dependencies] config = "0.13.1" toml = "0.5.9" lazy_static = "1.4" serde = "1.0" serde_derive = "1.0"
新建 settings.rs ,寫入如下代碼:
use std::{fs::File, io::Read};
use lazy_static::lazy_static;
use serde::Deserialize;
#[derive(Debug, Deserialize)]
pub struct Database {
pub url: String,
}
#[derive(Debug, Deserialize)]
pub struct Log {
pub debug: bool,
pub debug_sql: bool,
pub log_root: String,
}
#[derive(Debug, Deserialize)]
pub struct Settings {
pub database: Database,
pub log: Log,
}
impl Default for Settings {
fn default() -> Self {
let file_path = "config.toml";
let mut file = match File::open(file_path) {
Ok(f) => f,
Err(e) => panic!("no such file {} exception:{}", file_path, e)
};
let mut str_val = String::new();
match file.read_to_string(&mut str_val) {
Ok(s) => s,
Err(e) => panic!("Error Reading file: {}", e)
};
toml::from_str(&str_val).expect("Parsing the configuration file failed");
}
}
impl Settings {
pub fn get<'a>() -> &'a Self {
// 給靜態(tài)變量延遲賦值的宏
lazy_static! {
static ref CACHE: Settings = Settings::default();
}
&CACHE
}
}
main.rs 代碼如下:
use crate::settings::Settings;
mod settings;
fn main() {
let setting = Settings::get();
println!("{:?}", setting.database.url);
println!("{:?}", setting.log);
}
運(yùn)行結(jié)果:
"postgres://postgres:123456@localhost/test"
Log { debug: true, debug_sql: false, log_root: "/tmp" }
到此這篇關(guān)于Rust讀取配置文件的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)Rust讀取配置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解在Rust語(yǔ)言中如何聲明可變的static類型變量
在Rust中,可以使用lazy_static宏來(lái)聲明可變的靜態(tài)變量,lazy_static是一個(gè)用于聲明延遲求值靜態(tài)變量的宏,本文將通過一個(gè)簡(jiǎn)單的例子,演示如何使用?lazy_static?宏來(lái)聲明一個(gè)可變的靜態(tài)變量,需要的朋友可以參考下2023-08-08
使用cargo install安裝Rust二進(jìn)制工具過程
cargoinstall是一個(gè)用于安裝包含可執(zhí)行目標(biāo)的Rust包的命令行工具,類似于系統(tǒng)軟件包管理器,但它為Rust開發(fā)者提供了一種簡(jiǎn)潔的方式來(lái)安裝和管理命令行工具,安裝后,二進(jìn)制文件會(huì)存儲(chǔ)在$HOME/.cargo/bin目錄中,需要將該目錄添加到$PATH環(huán)境變量中才能在命令行中直接運(yùn)行2025-02-02
Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制完整代碼
在 Rust 中,如果想為enum實(shí)現(xiàn)一個(gè)帶多參數(shù)的 Hook 機(jī)制,可以結(jié)合模式匹配和枚舉來(lái)處理,這種方式可以擴(kuò)展到支持不同類型的輸入?yún)?shù)和邏輯處理,下面通過示例代碼介紹Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制,感興趣的朋友一起看看吧2024-12-12
利用Rust編寫一個(gè)簡(jiǎn)單的字符串時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了一個(gè)用rust寫的一個(gè)簡(jiǎn)單的練手的demo,一個(gè)字符串時(shí)鐘,在終端用字符串方式顯示當(dāng)前時(shí)間,感興趣的小伙伴可以了解一下2022-12-12
Rust中non_exhaustive的enum使用確保程序健壯性
這篇文章主要為大家介紹了Rust中non_exhaustive的enum使用確保程序健壯性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11

