refactor: replace unwrap_or with unwrap_or_else for improved error handling (#5163)

In Rust, the `or` and `or_else` methods have distinct behavioral differences. The `or` method always eagerly evaluates its argument and executes any associated function calls. This can lead to unnecessary performance costs—especially in expensive operations like string processing or file handling—and may even trigger unintended side effects.

In contrast, `or_else` evaluates its closure lazily, only when necessary. Introducing a Clippy lint to disallow `or` sacrifices a bit of code simplicity but ensures predictable behavior and enforces lazy evaluation for better performance.
This commit is contained in:
Tunglies
2025-10-22 17:33:55 +08:00
committed by GitHub
parent a05ea64bcd
commit 2d2167e048
18 changed files with 70 additions and 52 deletions

View File

@@ -1,6 +1,6 @@
use super::CmdResult;
use crate::{cmd::StringifyErr, config::*, core::CoreManager, log_err};
use anyhow::Context;
use anyhow::{Context, anyhow};
use serde_yaml_ng::Mapping;
use smartstring::alias::String;
use std::collections::HashMap;
@@ -19,7 +19,7 @@ pub async fn get_runtime_yaml() -> CmdResult<String> {
let config = runtime.config.as_ref();
config
.ok_or(anyhow::anyhow!("failed to parse config to yaml file"))
.ok_or_else(|| anyhow!("failed to parse config to yaml file"))
.and_then(|config| {
serde_yaml_ng::to_string(config)
.context("failed to convert config to yaml")
@@ -48,7 +48,7 @@ pub async fn get_runtime_proxy_chain_config(proxy_chain_exit_node: String) -> Cm
let config = runtime
.config
.as_ref()
.ok_or(anyhow::anyhow!("failed to parse config to yaml file"))
.ok_or_else(|| anyhow!("failed to parse config to yaml file"))
.stringify_err()?;
if let Some(serde_yaml_ng::Value::Sequence(proxies)) = config.get("proxies") {