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}