///|
/// 沐澜水文 frontend 入口 - V0.9.1
///
/// TEA架构(Model/Msg/Update/View) + wasm_slim_model轻量化试算
/// 后续V1.0接入Rabbita+Rui时,View转换为Rui组件树
///|
/// P1修复:按字符截断字符串,避免截断UTF-8多字节字符
fn safe_preview(s : String, max_bytes : Int) -> String {
if s.length() <= max_bytes {
return s
}
let buf = StringBuilder()
let mut byte_count = 0
for ch in s.iter() {
let ch_len = ch.to_string().length()
if byte_count + ch_len > max_bytes {
break
}
buf.write_char(ch)
byte_count = byte_count + ch_len
}
buf.to_string() + "..."
}
///|
fn main {
println("===== 沐澜水文 frontend V0.9.1 - TEA架构演示 =====")
// 初始化Model
let mut model = @lib.AppModel::initial()
println(
"初始状态: 页面=\{model.ui_state.current_page}, 流域=\{model.sim_params.basin_name}",
)
// TEA消息循环演示
// 1. 导航到仿真页
model = @lib.update(model, @lib.Msg::NavigateTo(@lib.Page::SimPage))
println("导航后: 页面=\{model.ui_state.current_page}")
// 2. 加载闽江竹岐流域
model = @lib.update(model, @lib.Msg::LoadBasinCase("闽江竹岐"))
println(
"加载案例后: 流域=\{model.sim_params.basin_name}, 面积=\{model.sim_params.area} km²",
)
// 3. 运行仿真
model = @lib.update(model, @lib.Msg::RunSimulation)
println("启动仿真: is_running=\{model.sim_result.is_running}")
// 4. 执行实际仿真(通过wasm_slim_model)
let slim_request : @lib.SlimSimRequest = {
area: model.sim_params.area,
dt: model.sim_params.dt,
rainfall: model.sim_params.forcings.map(fn(f) { f.rainfall }),
evaporation: model.sim_params.forcings.map(fn(f) { f.evaporation }),
params: Some(model.sim_params.params), // P2修复:使用实际加载的流域参数
}
let slim_result = @lib.slim_run(slim_request)
println(
"转内试算: 洪峰=\{slim_result.peak_flow}, 总量=\{slim_result.total_volume}",
)
// 5. 仿真完成,更新Model
let xaj_model = @shared.XinanjiangModel::new(
params=model.sim_params.params,
area=model.sim_params.area,
dt=model.sim_params.dt,
)
let xaj_result = xaj_model.run(model.sim_params.forcings)
model = @lib.update(model, @lib.Msg::SimulationCompleted(xaj_result))
println(
"仿真完成: 洪峰=\{model.sim_result.peak_flow} m³/s, 时段=\{model.sim_result.peak_time}",
)
// 6. 生成视图并渲染为文本
let view_node = @lib.view(model)
let report = @lib.view_to_text(view_node)
let report_preview = safe_preview(report, 500)
println("\n===== 视图文本渲染 =====")
println(report_preview)
// 7. 轻量化试算演示
println("\n===== wasm_slim_model 轻内试算 =====")
let quick_result = @lib.quick_run([10.0, 20.0, 5.0, 0.0, 30.0])
println(
"快速试算: 洪峰=\{quick_result.peak_flow}, 总量=\{quick_result.total_volume}",
)
// 8. JSON端到端演示
let json_request = ToJson::to_json(slim_request).stringify()
let json_response = @lib.slim_json_endpoint(json_request)
let resp_preview = safe_preview(json_response, 200)
println("JSON响应: \{resp_preview}")
// 9. 可用流域列表
println("\n===== 可用流域 =====")
let basins = @lib.available_basins()
for name in basins {
let config = @lib.load_basin_config(name)
println(" \{name}: 面积=\{config.area} km², 时段=\{config.dt} h")
}
}