Function fetch_bms_table

Source
pub async fn fetch_bms_table(url: &str) -> Result<BmsTable>
Expand description

从URL直接获取BmsTable对象(合并上述两个步骤)

§参数

  • url - BMS表格HTML页面的URL

§返回值

返回解析后的BmsTable对象

§错误

如果无法获取数据或解析失败,将返回错误

§示例

use bms_table::fetch_bms_table;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let bms_table = fetch_bms_table("https://example.com/table.html").await?;
    println!("表格名称: {}", bms_table.name);
    println!("分数数据数量: {}", bms_table.scores.len());
    Ok(())
}
Examples found in repository?
examples/demo.rs (line 74)
13async fn main() -> Result<()> {
14    println!("BMS表格函数演示");
15    println!("================");
16
17    // 示例1: 从JSON数据创建BmsTable对象
18    println!("\n1. 从JSON数据创建BmsTable对象:");
19    let header_url = "https://example.com/header.json";
20    let header_json = json!({
21        "name": "Test Table",
22        "symbol": "test",
23        "data_url": "score.json",
24        "course": []
25    });
26    let data_json = json!([
27        {
28            "level": "1",
29            "title": "Test Song",
30            "artist": "Test Artist",
31            "md5": "test123456789"
32        }
33    ]);
34
35    match create_bms_table_from_json(header_url, header_json, data_json).await {
36        Ok(bms_table) => {
37            println!("✅ 成功创建BmsTable对象");
38            println!("   表格名称: {}", bms_table.name);
39            println!("   表格符号: {}", bms_table.symbol);
40            println!("   分数数据数量: {}", bms_table.scores.len());
41        }
42        Err(e) => {
43            println!("❌ 创建BmsTable对象失败: {}", e);
44        }
45    }
46
47    // 示例2: 从URL获取JSON数据
48    println!("\n2. 从URL获取JSON数据:");
49    let test_url = "https://stellabms.xyz/sl/table.html";
50
51    match fetch_table_json_data(test_url).await {
52        Ok((header_url, header_json, data_json)) => {
53            println!("✅ 成功获取JSON数据");
54            println!("   Header URL: {}", header_url);
55            println!(
56                "   Header JSON 键: {:?}",
57                header_json
58                    .as_object()
59                    .map(|obj| obj.keys().collect::<Vec<_>>())
60            );
61            println!(
62                "   Data JSON 数组长度: {}",
63                data_json.as_array().map(|arr| arr.len()).unwrap_or(0)
64            );
65        }
66        Err(e) => {
67            println!("❌ 获取JSON数据失败: {}", e);
68        }
69    }
70
71    // 示例3: 从URL直接获取BmsTable对象
72    println!("\n3. 从URL直接获取BmsTable对象:");
73
74    match fetch_bms_table(test_url).await {
75        Ok(bms_table) => {
76            println!("✅ 成功获取BmsTable对象");
77            println!("   表格名称: {}", bms_table.name);
78            println!("   表格符号: {}", bms_table.symbol);
79            println!("   课程数量: {}", bms_table.course.len());
80            println!("   分数数据数量: {}", bms_table.scores.len());
81
82            // 显示前几个分数数据
83            println!("   前3个分数数据:");
84            for (i, score) in bms_table.scores.iter().take(3).enumerate() {
85                println!(
86                    "     {}. {} - {} [{}]",
87                    i + 1,
88                    score.title.as_ref().unwrap_or(&"未知标题".to_string()),
89                    score.artist.as_ref().unwrap_or(&"未知艺术家".to_string()),
90                    score.level
91                );
92            }
93        }
94        Err(e) => {
95            println!("❌ 获取BmsTable对象失败: {}", e);
96        }
97    }
98
99    println!("\n演示完成!");
100    Ok(())
101}