Files
cursebreaker-parser-rust/cursebreaker-parser/examples/shops_example.rs
2026-01-11 02:46:49 +00:00

135 lines
4.9 KiB
Rust

use cursebreaker_parser::ShopDatabase;
use std::env;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Load all shops from XML
let cb_assets_path = env::var("CB_ASSETS_PATH").unwrap_or_else(|_| "/home/connor/repos/CBAssets".to_string());
let shop_db = ShopDatabase::load_from_xml(
&format!("{}/Data/XMLs/Shops/Shops.xml", cb_assets_path),
)?;
println!("=== Shop Database Statistics ===");
println!("Total shops: {}", shop_db.len());
println!("General stores: {}", shop_db.get_general_stores().len());
println!("Specialized shops: {}", shop_db.get_specialized_shops().len());
println!("Non-empty shops: {}", shop_db.get_non_empty_shops().len());
println!("Total items across all shops: {}", shop_db.total_item_count());
println!("Unique items sold: {}", shop_db.get_all_item_ids().len());
println!();
// Show all general stores
println!("=== General Stores ===");
let general_stores = shop_db.get_general_stores();
for shop in &general_stores {
println!(" [ID {}] {} ({} items)", shop.shop_id, shop.name, shop.item_count());
if let Some(ref comment) = shop.comment {
println!(" Comment: {}", comment);
}
}
println!();
// Show some specialized shops
println!("=== Specialized Shops (first 10) ===");
let specialized = shop_db.get_specialized_shops();
for shop in specialized.iter().take(10) {
println!(" [ID {}] {} ({} items)", shop.shop_id, shop.name, shop.item_count());
if let Some(ref comment) = shop.comment {
println!(" Comment: {}", comment);
}
}
println!("... and {} more", specialized.len().saturating_sub(10));
println!();
// Show details of a specific shop
if let Some(shop) = shop_db.get_by_id(3) {
println!("=== Shop Details (ID 3) ===");
println!("Name: {}", shop.name);
println!("Is General Store: {}", shop.is_general_store);
println!("Total items: {}", shop.item_count());
println!("\nItems:");
for (i, item) in shop.items.iter().take(10).enumerate() {
print!(" {}) Item ID: {}", i + 1, item.item_id);
if let Some(ref name) = item.name {
print!(" ({})", name);
}
if let Some(price) = item.price {
print!(" - {} gold", price);
}
if let Some(stock) = item.max_stock {
print!(" - max stock: {}", stock);
}
if let Some(restock) = item.restock_time {
print!(" - restock: {}s", restock);
}
println!();
}
if shop.item_count() > 10 {
println!(" ... and {} more items", shop.item_count() - 10);
}
}
println!();
// Show shops that sell a specific item
println!("=== Shops Selling Item '167' (Fishing Rod) ===");
let fishing_rod_shops = shop_db.get_shops_selling_item("167");
for shop in &fishing_rod_shops {
println!(" [ID {}] {}", shop.shop_id, shop.name);
if let Some(item) = shop.get_item_by_id("167") {
if let Some(ref name) = item.name {
print!(" - {}", name);
}
if let Some(price) = item.price {
print!(" (custom price: {} gold)", price);
}
println!();
}
}
println!();
// Show shop with most items
if let Some(largest_shop) = shop_db.all_shops().iter().max_by_key(|s| s.item_count()) {
println!("=== Largest Shop ===");
println!("Name: {}", largest_shop.name);
println!("Item count: {}", largest_shop.item_count());
println!();
}
// Show items with unlimited stock in a shop
if let Some(shop) = shop_db.get_by_id(3) {
println!("=== Unlimited Stock Items in {} ===", shop.name);
let unlimited = shop.get_unlimited_stock_items();
for item in unlimited.iter().take(5) {
print!(" Item ID: {}", item.item_id);
if let Some(ref name) = item.name {
print!(" ({})", name);
}
println!();
}
if unlimited.len() > 5 {
println!(" ... and {} more", unlimited.len() - 5);
}
}
println!();
// Show items with limited stock
if let Some(shop) = shop_db.get_by_id(8) {
println!("=== Limited Stock Items in Shop ID 8 ===");
let limited = shop.get_limited_stock_items();
for item in &limited {
print!(" Item ID: {}", item.item_id);
if let Some(ref name) = item.name {
print!(" ({})", name);
}
if let Some(stock) = item.max_stock {
print!(" - max stock: {}", stock);
}
if let Some(minutes) = item.get_restock_minutes() {
print!(" - restocks every {:.1} min", minutes);
}
println!();
}
}
Ok(())
}