Skip to content

Commit 023ce2f

Browse files
committed
🎨 chore(tarot_ai): tidy tarot_ai.rs
1 parent 342e407 commit 023ce2f

File tree

2 files changed

+27
-24
lines changed

2 files changed

+27
-24
lines changed

src/mods/tarot_ai.rs

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use teloxide_core::types::*;
1111

1212
use crate::assets::tarot;
1313
use crate::linquebot::*;
14+
use crate::utils::partition_results;
1415
use crate::utils::telegram::prelude::WarnOnError;
1516
use crate::Consumption;
1617

@@ -46,40 +47,25 @@ struct AiResponseChoice {
4647
message: AiMessage,
4748
}
4849

49-
async fn get_env_var(key: &str) -> anyhow::Result<String> {
50-
match env::var(key) {
51-
Ok(val) => Ok(val),
52-
Err(err) => {
53-
warn!("get-env-var-error, please specify {key}:\n{err}");
54-
Err(err.into())
55-
}
56-
}
50+
fn get_env_var(key: &str) -> Result<String, String> {
51+
env::var(key).map_err(|err| format!("{key}: {err}"))
5752
}
5853

5954
async fn get_tarot(question: &str) -> anyhow::Result<String> {
6055
let client = reqwest::Client::new();
6156

6257
let tarots = tarot::n_random_majors(3)
6358
.into_iter()
64-
.map(|t| {
65-
format!(
66-
"序号:{},是否反转:{}",
67-
t.id,
68-
if t.is_reverse { "是" } else { "否" }
69-
)
70-
})
59+
.map(|t| t.to_string())
7160
.collect::<Vec<_>>()
7261
.join("\n");
7362

74-
let url = get_env_var("AI_API_URL").await;
75-
let token = get_env_var("AI_API_TOKEN").await;
76-
let model = get_env_var("AI_API_MODEL").await;
77-
78-
// 这样写是为了让一个环境变量未找到时,也尝试查找剩余的几个。
79-
// 让报错更全面,避免反复重启看报错。
80-
let url = url?;
81-
let token = token?;
82-
let model = model?;
63+
let [url, token, model] = partition_results([
64+
get_env_var("AI_API_URL"),
65+
get_env_var("AI_API_TOKEN"),
66+
get_env_var("AI_API_MODEL"),
67+
])
68+
.map_err(|errs| anyhow::anyhow!(errs.join("\n")))?;
8369

8470
let prompt = match env::var("TAROT_AI_PROMPT") {
8571
Ok(val) => val,

src/utils/mod.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,23 @@ pub fn split_args<const N: usize>(src: &str) -> [&str; N] {
7474
res
7575
}
7676

77+
pub fn partition_results<const N: usize, T, E>(input: [Result<T, E>; N]) -> Result<[T; N], Vec<E>> {
78+
let mut oks: [Option<T>; N] = [(); N].map(|_| None);
79+
let mut errs: Vec<E> = Vec::new();
80+
for (i, item) in input.into_iter().enumerate() {
81+
match item {
82+
Ok(v) => oks[i] = Some(v),
83+
Err(e) => errs.push(e),
84+
}
85+
}
86+
if errs.is_empty() {
87+
// SAFETY: we have ensured all elements in `oks` are `Some`
88+
Ok(oks.map(|o| o.unwrap()))
89+
} else {
90+
Err(errs)
91+
}
92+
}
93+
7794
pub mod telegram {
7895
pub mod prelude {
7996
use std::future::Future;

0 commit comments

Comments
 (0)