// ============================================================
// N-Triples / N-Quads 序列化器
// ============================================================
///|
/// N-Triples 序列化器
pub struct Serializer {
data : ArrayView[Byte]
mode : StringView
}
///|
/// 创建序列化器
pub fn Serializer::new(
data : ArrayView[Byte],
mode? : StringView = "triple",
) -> Serializer {
{ data, mode }
}
///|
/// 序列化单个 Quad
pub fn Serializer::serialize(self : Serializer, quad : QuadEmit) -> String {
let buf = StringBuilder::new()
self.append_quad(quad, buf)
buf.to_string()
}
///|
/// 写入字节视图
fn Serializer::append_span(
_self : Serializer,
view : ArrayView[Byte],
buf : StringBuilder,
) -> Unit {
for b in view {
buf.write_char(b.to_char())
}
}
///|
/// 序列化主语
fn Serializer::append_subject(
self : Serializer,
subject : Subject,
buf : StringBuilder,
) -> Unit {
match subject {
Subject::Iri(view) => self.append_span(view, buf)
Subject::BNode(view) => {
buf.write_string("_:")
self.append_span(view[2:], buf) // 跳过 "_:" 前缀
}
Subject::PrefName(view) => self.append_span(view, buf)
}
}
///|
/// 序列化宾语
fn Serializer::append_object(
self : Serializer,
object : Object,
buf : StringBuilder,
) -> Unit {
match object {
Object::Iri(view) => self.append_span(view, buf)
Object::BNode(view) => {
buf.write_string("_:")
self.append_span(view[2:], buf)
}
Object::Literal(view) => self.append_span(view, buf)
Object::PrefName(view) => self.append_span(view, buf)
}
}
///|
/// 序列化完整 Quad (包含图名)
fn Serializer::append_quad(
self : Serializer,
quad : QuadEmit,
buf : StringBuilder,
) -> Unit {
self.append_subject(quad.subject, buf)
buf.write_char(' ')
self.append_span(quad.predicate, buf)
buf.write_char(' ')
self.append_object(quad.object, buf)
match quad.graph {
GraphName::Iri(view) => {
buf.write_char(' ')
self.append_span(view, buf)
}
GraphName::None => ()
}
buf.write_string(" .\n")
}
///|
/// 序列化 Triple (忽略图名)
fn Serializer::append_triple(
self : Serializer,
quad : QuadEmit,
buf : StringBuilder,
) -> Unit {
self.append_subject(quad.subject, buf)
buf.write_char(' ')
self.append_span(quad.predicate, buf)
buf.write_char(' ')
self.append_object(quad.object, buf)
buf.write_string(" .\n")
}
///|
/// 批量序列化
pub fn Serializer::serialize_all(
self : Serializer,
quads : Array[QuadEmit],
) -> String {
let buf = StringBuilder::new()
for quad in quads {
lexmatch self.mode with longest {
re"^(?i:triple|Triple)$" => self.append_triple(quad, buf) // 三元组模式
re"^(?i:quad|nquads|Quad|all)$" => self.append_quad(quad, buf) // 四元组模式
re"^(?i:quadonly)$" =>
match quad.graph {
GraphName::Iri(_) => self.append_quad(quad, buf) // 仅有名图的
GraphName::None => ()
}
_ => self.append_triple(quad, buf) // 默认三元组
}
}
buf.to_string()
}