use crate::utils::error::{BotError, BotResult}; use minecraft_data_rs::api::Api; use minecraft_data_rs::models::block::Block; use minecraft_data_rs::models::food::Food; #[derive(Clone, Debug)] pub struct ItemFullInformation { pub id: String, pub name: String, pub enchantments: Vec, pub durability: Option, pub stack_size: u8, pub food: Option, pub block: Option, } pub fn get_item_full_information(name: &str, api: &Api) -> BotResult { let items_by_name = api.items.items_by_name()?; let item = items_by_name.get(name).ok_or(BotError::Msg(format!( "The item `{}` could not be found", name )))?; let enchantments_by_category = api.enchantments.enchantments_by_category()?; let mut enchantments = Vec::new(); if let Some(enchant_categories) = &item.enchant_categories { enchantments = enchant_categories .into_iter() .filter_map(|c| enchantments_by_category.get(c)) .flatten() .map(|e| e.display_name.clone()) .collect::>(); } let food_by_name = api.foods.foods_by_name()?; let blocks_by_name = api.blocks.blocks_by_name()?; tracing::trace!("Item is {:?}", item); Ok(ItemFullInformation { id: item.name.clone(), name: item.display_name.clone(), enchantments, durability: item.durability.clone(), stack_size: item.stack_size, food: food_by_name.get(name).cloned(), block: blocks_by_name.get(name).cloned(), }) }