rocalc 0.3.0

一款用于计算洛克王国:世界精灵对决的Rust库
Documentation
//! 获取基础数据

use csv::ReaderBuilder;
use std::error::Error;
use crate::core::Six;

/// 输入精灵的名字,获得种族值。
///
/// 注意:get_race_value 函数仅支持csv文件,其csv表头必须含有name, hp, atk, m_atk, dfe, m_dfe, spd 才可正确识别。您可去[此处](https://codeberg.org/dddight/roco-kingdom-sprites-csv/releases)下载支持的csv文件供此函数使用。
///
/// # Example
///
/// ```rust
/// use rocalc::get_race_value;
///
/// get_race_value("魔力猫", "your_path.csv");
/// ```
///
/// 若您希望使用自己的精灵种族值数据,请确保返回 [Six](struct.Six.html) 结构体供后续 [Tri](struct.Tri.html) 结构体使用。
pub fn get_race_value(name: &str, path: &str) -> Result<Six, Box<dyn Error>> {
    let mut rdr = ReaderBuilder::new().flexible(true).from_path(path)?;

    #[derive(serde::Deserialize)]
    struct SpriteRow {
        name: String,
        hp: f32,
        atk: f32,
        m_atk: f32,
        dfe: f32,
        m_dfe: f32,
        spd: f32,
    }

    // 2. 用替身去接住反序列化的数据
    let result = rdr
        .deserialize::<SpriteRow>()
        .filter_map(|result| result.ok())
        .find(|row| row.name == name)
        .map(|row| Six {
            hp: row.hp,
            atk: row.atk,
            m_atk: row.m_atk,
            dfe: row.dfe,
            m_dfe: row.m_dfe,
            spd: row.spd,
        });

    match result {
        Some(six) => Ok(six),
        None => Err(Box::from("没有找到精灵")),
    }
}