From 7997857d655a1a628a314d8f4a71b0abda45bfa7 Mon Sep 17 00:00:00 2001 From: Zynh0722 Date: Sun, 25 Feb 2024 15:12:20 -0800 Subject: [PATCH] more effecient lodestone-fetcher usage --- src/main.rs | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main.rs b/src/main.rs index 0ce855f..e3c20ec 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,23 +4,27 @@ mod raw_data; use crate::compile_data::{DpsRole, JobStats, Role}; use crate::raw_data::RawJobStats; +use std::io::BufRead; use std::process::{Command, Stdio}; fn get_job_stats(lodestone_ids: &[usize]) -> anyhow::Result>> { - let mut player_stats = Vec::new(); - for id in lodestone_ids { - let output = Command::new("lodestone-fetcher") - .arg(id.to_string()) - .stdout(Stdio::piped()) - .output() - .expect("Failed to execute lodestone-fetcher"); + let output = Command::new("lodestone-fetcher") + .args(lodestone_ids.iter().map(|id| id.to_string())) + .stdout(Stdio::piped()) + .output() + .expect("Failed to execute lodestone-fetcher"); - let raw: Vec = serde_json::from_reader(&output.stdout[..])?; + let raw_data = output.stdout.lines(); + let data: Vec, _>> = raw_data + .map_while(Result::ok) + .map(|raw| serde_json::from_str(&raw)) + .map(|raw_stats: Result, _>| { + raw_stats.map(|raw| raw.into_iter().map(|r| r.into()).collect()) + }) + .map(|stats| stats.map_err(|err| anyhow::anyhow!(err))) + .collect(); - player_stats.push(Ok(raw.into_iter().map(|r| r.into()).collect())); - } - - player_stats.into_iter().collect() + data.into_iter().collect() } fn main() -> anyhow::Result<()> {