///|
/// TriG 示例总入口,顺序执行多个 case
async fn main {
demo_all()
}
///|
/// 冒烟/演示本体(wbtest 直调同链;main 只留进程入口)
async fn demo_all() -> Unit {
let path = "./example.trig"
@async.with_task_group() <| root => {
root.add_defer(() => @fs.remove(path))
case_basic()
case_prefix_and_base()
case_blank_node_graph()
case_collection_nested()
case_relpath_under_base()
case_turtle_dialect()
case_serialize_strict_drop()
case_at_prefixed_directives()
println("done: all trigger samples printed")
}
}
///|
/// case_basic: 基础 TriG,混合默认图与命名图
async fn case_basic() -> Unit {
println("-- case_basic --")
let content =
#| .
#| .
#| {
#| .
#|}
run_demo(content)
}
///|
/// case_prefix_and_base: 展示 prefix/base 关键字用法
async fn case_prefix_and_base() -> Unit {
println("-- case_prefix_and_base --")
let content =
#|@prefix ex: .
#|@base .
#|ex:s1 ex:p1 ex:o1 .
#|ex:s2 ex:p2 .
run_demo(content)
}
///|
/// case_blank_node_graph: 图名位为空白节点
async fn case_blank_node_graph() -> Unit {
println("-- case_blank_node_graph --")
let content =
#| .
#|_:lbl {
#| _:b1 .
#|}
run_demo(content)
}
///|
/// case_collection_nested: 使用列表和嵌套结构
async fn case_collection_nested() -> Unit {
println("-- case_collection_nested --")
let content =
#|_:subject ("a" "b" "c") .
#|_:subject (1 2 (3 4)) .
run_demo(content)
}
///|
/// case_relpath_under_base: 展示相对 IRI 在 base 下解析
async fn case_relpath_under_base() -> Unit {
println("-- case_relpath_under_base --")
let content =
#|@base .
#| <../other> .
#| <./same/dir> .
run_demo(content)
}
///|
/// case_turtle_dialect: 仅解析 Turtle 子集,图块区不被允许
async fn case_turtle_dialect() -> Unit {
println("-- case_turtle_dialect --")
let content =
#|@prefix ex: .
#|ex:s ex:p ex:o .
run_demo_turtle(content)
}
///|
/// case_serialize_strict_drop: 展示序列化时 Turtle 模式下的 strict/drop 行为
async fn case_serialize_strict_drop() -> Unit {
println("-- case_serialize_strict_drop --")
let content =
#|@prefix ex: .
#|ex:g { ex:s ex:p ex:o . }
run_demo_strict_drop(content)
}
///|
/// case_at_prefixed_directives: 展示 @ 风格的指令名前缀
async fn case_at_prefixed_directives() -> Unit {
println("-- case_at_prefixed_directives --")
let content =
#| .
#|@prefix ex: .
#|@base .
#|ex:s ex:p ex:o .
run_demo(content)
}
///|
/// 公共演示管线:写盘 -> 读字节 -> 解析(统计/错误)-> 物化 -> 序列化打印
async fn demo(content : String, ser : @gen_trig.TrigSerializer) -> Unit {
let path = "./example.trig"
@fs.write_file(path, content, create_mode=CreateOrTruncate)
let data = @fs.read_file(path).binary()
let engine = @gen_trig.TrigEngine::from_bytes(data.to_array())
let slice = @gen_trig.TrigSliceParser::new(engine, Bytes::to_array(data))
let (quad_spans, parse_errors) = slice.parse_all()
println(
"parsed quads=\{quad_spans.length()}, errors=\{parse_errors.length()}",
)
for err in parse_errors {
println(" ERR: \{err}")
}
let mat = @gen_trig.TrigMaterializer::new(
data.to_array()[:],
slice.prefixes(),
bases=slice.bases(),
)
let (emits, mat_errors) = mat.materialize_all(quad_spans)
for err in mat_errors {
println(" MAT-ERR: \{err}")
}
match ser.serialize(emits) {
Ok(text) => if text.length() > 0 { println(text) }
Err(err) => println(" SER-ERR: \{err}")
}
}
///|
/// 通用执行器:TriG 格式化输出(默认图三元组 + 命名图块区)
async fn run_demo(content : String) -> Unit {
demo(content, @gen_trig.TrigSerializer::new())
}
///|
/// Turtle 方言演示:Turtle 格式输出
async fn run_demo_turtle(content : String) -> Unit {
demo(
content,
@gen_trig.TrigSerializer::new(format=@gen_trig.SerializeFormat::Turtle),
)
}
///|
/// strict/drop 序列化演示:同一输入两种图名策略对比
async fn run_demo_strict_drop(content : String) -> Unit {
println("-- strict --")
demo(
content,
@gen_trig.TrigSerializer::new(format=@gen_trig.SerializeFormat::Turtle),
)
println("-- drop --")
demo(
content,
@gen_trig.TrigSerializer::new(
format=@gen_trig.SerializeFormat::Turtle,
graph_policy=@gen_trig.GraphPolicy::Drop,
),
)
}