Function fetch_table_json_data

Source
pub async fn fetch_table_json_data(url: &str) -> Result<(String, Value, Value)>
Expand description

从URL获取header的绝对URL地址、header和data的JSON解析树

§参数

  • url - BMS表格HTML页面的URL

§返回值

返回一个元组,包含header的绝对URL地址、header的JSON解析树和data的JSON解析树

§错误

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

§示例

use bms_table::fetch_table_json_data;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let (header_url, header_json, data_json) = fetch_table_json_data("https://example.com/table.html").await?;
    println!("Header URL: {}", header_url);
    println!("Header JSON: {:?}", header_json);
    println!("Data JSON: {:?}", data_json);
    Ok(())
}
Examples found in repository?
examples/demo.rs (line 51)
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}