///|
pub struct TurtleParser {
mut lenient : Bool
mut base_iri : Iri?
prefixes : Map[String, Iri]
} derive(Default)
///|
pub fn TurtleParser::new() -> TurtleParser {
TurtleParser::default()
}
///|
pub fn TurtleParser::lenient(self : TurtleParser) -> TurtleParser {
self.lenient = true
self
}
///|
pub fn TurtleParser::with_base_iri(
self : TurtleParser,
base_iri : IriRef,
) -> Result[TurtleParser, IriError] {
let parsed_iri = if self.lenient {
// 宽松模式:直接解析,不检查有效性
IriRef::parse_unchecked(base_iri)
} else {
// 严格模式:检查解析结果
match IriRef::parse(base_iri) {
Ok(iri) => iri
Err(e) => return Err(e)
}
}
self.base_iri = Some(parsed_iri)
Ok(self)
}
///|
pub fn TurtleParser::with_prefix(
self : TurtleParser,
prefix_name : String,
prefix_iri : IriRef,
) -> Result[TurtleParser, IriError] {
let parsed_iri = if self.lenient {
// 宽松模式:直接解析,不检查有效性
IriRef::parse_unchecked(prefix_iri)
} else {
// 严格模式:检查解析结果
match IriRef::parse(prefix_iri) {
Ok(iri) => iri
Err(e) => return Err(e)
}
}
self.prefixes.set(prefix_name, parsed_iri)
Ok(self)
}
///|
pub fn TurtleParser::for_reader(
self : TurtleParser,
reader : &Reader,
) -> ReaderTurtleParser[RdfLexer] {
{ inner: self.low_level().parser.for_reader(reader) }
}
///|
pub fn TurtleParser::for_async_reader(
self : TurtleParser,
reader : &Reader,
) -> AsyncReaderTurtleParser[RdfLexer] {
{ inner: self.low_level().parser.for_async_reader(reader) }
}
///|
pub fn TurtleParser::for_slice(
self : TurtleParser,
slice : BytesView,
) -> SliceTurtleParser[TriGRecognizer] {
let parser = TriGRecognizer::new_parser(
slice.to_array(),
false,
false, // 补充缺失的第2个参数,假设默认为 false
self.lenient,
self.base_iri,
self.prefixes,
)
{ inner: { parser, } }
}
///|
pub fn TurtleParser::split_slice_for_parallel_parsing(
self : TurtleParser,
slice : BytesView,
target_parallelism : Int,
) -> Array[SliceTurtleParser[TriGRecognizer]] {
let slice_size = slice.length()
let chunk_size = MIN_PARALLEL_CHUNK_SIZE
let n_chunks_raw = slice_size / chunk_size
let n_chunks = n_chunks_raw.clamp(min=1, max=target_parallelism)
let mut current_parser = self //
if n_chunks > 1 {
let from_slice_parser = current_parser.for_slice(slice)
// 注意:原代码中 next() 的返回值未处理,且 prefixes 迭代逻辑可能存在副作用问题
// 这里保留原逻辑结构,仅修复语法错误
let _ = from_slice_parser.inner.next()
for entry in from_slice_parser.prefixes().inner {
let p = entry.0
let iri = entry.1.as_ref()
match current_parser.with_prefix(p, iri) {
Ok(parser) => current_parser = parser
Err(_) => () // 忽略错误,或根据需求处理
}
}
}
// 修复点:修改 lambda 参数写法,并确保返回正确的类型
get_turtle_slice_chunks(slice, n_chunks).map(fn(chunk) {
let start = chunk.0
let end = chunk.1
self.for_slice(slice[start:end])
})
}
///|
pub fn TurtleParser::low_level(
self : TurtleParser,
) -> LowLevelTurtleParser[RdfLexer] {
{
parser: TriGRecognizer::new_parser(
[],
false,
false,
self.lenient,
self.base_iri,
self.prefixes,
),
}
}
///|
pub struct ReaderTurtleParser[RL] {
inner : ReaderIterator[RL, TriGRecognizer]
}
///|
pub fn[RL] ReaderTurtleParser::prefixes(
self : ReaderTurtleParser[RL],
) -> TurtlePrefixesIter {
match self.inner.parser.context {
RdfContext::N3RecognizerContext(ctx) => { inner: ctx.prefixes.iter() }
_ => { inner: [].iter() }
}
}
///|
pub fn[RL] ReaderTurtleParser::base_iri(
self : ReaderTurtleParser[RL],
) -> String? {
match self.inner.parser.context {
RdfContext::N3RecognizerContext(ctx) =>
ctx.lexer_options.base_iri.map(fn(iri) { iri.to_string() })
_ => None
}
}
///|
pub struct AsyncReaderTurtleParser[RL] {
inner : AsyncReaderIterator[RL, TriGRecognizer]
}
///|
pub async fn[RL : TokenRecognizer] AsyncReaderTurtleParser::next(
self : AsyncReaderTurtleParser[RL],
) -> Result[N3Quad, TurtleError]? {
self.inner
.next()
.map(fn(res) {
res
.map(fn(lex_output) {
match lex_output {
RdfOut::Triple(triple) =>
Quad::Quad(
triple.subject,
triple.predicate,
triple.object,
GraphName::default(),
).as_n3quad()
RdfOut::Quad(quad) => quad.as_n3quad()
RdfOut::N3Quad(n3quad) => n3quad
}
})
.map_err(fn(e) { TurtleError::InvalidCharacter(e.to_string()) })
})
}
///|
pub fn[RL] AsyncReaderTurtleParser::prefixes(
self : AsyncReaderTurtleParser[RL],
) -> TurtlePrefixesIter {
match self.inner.parser.context {
RdfContext::N3RecognizerContext(ctx) =>
// 假设 ctx.prefixes 是 Map[String, IriRef] 或类似可迭代结构
{ inner: ctx.prefixes.iter() }
_ => { inner: [].iter() }
}
}
///|
pub fn[RL] AsyncReaderTurtleParser::base_iri(
self : AsyncReaderTurtleParser[RL],
) -> String? {
match self.inner.parser.context {
RdfContext::N3RecognizerContext(ctx) =>
ctx.lexer_options.base_iri.map(fn(iri) { iri.to_string() })
_ => None
}
}
///|
pub struct SliceTurtleParser[RL] {
inner : SliceIterator[RdfLexer, RL]
}
///|
pub fn[RL] SliceTurtleParser::prefixes(
self : SliceTurtleParser[RL],
) -> TurtlePrefixesIter {
match self.inner.parser.context {
RdfContext::N3RecognizerContext(ctx) => { inner: ctx.prefixes.iter() }
_ => { inner: [].iter() }
}
}
///|
pub fn[RL] SliceTurtleParser::base_iri(self : SliceTurtleParser[RL]) -> String? {
match self.inner.parser.context {
RdfContext::N3RecognizerContext(ctx) =>
ctx.lexer_options.base_iri.map(fn(iri) { iri.to_string() })
_ => None
}
}
// Iterator impl converted: use .iter() method or for-in loop
///|
pub struct LowLevelTurtleParser[RL] {
parser : Parser[RL, TriGRecognizer]
}
///|
pub fn[RL] LowLevelTurtleParser::extend_from_slice(
self : LowLevelTurtleParser[RL],
other : Bytes,
) -> Unit {
self.parser.extend_from_slice(other)
}
///|
pub fn[RL] LowLevelTurtleParser::end(self : LowLevelTurtleParser[RL]) -> Unit {
self.parser.end()
}
///|
pub fn[RL] LowLevelTurtleParser::is_end(
self : LowLevelTurtleParser[RL],
) -> Bool {
self.parser.is_end()
}
///|
pub fn[RL : TokenRecognizer] LowLevelTurtleParser::parse_next(
self : LowLevelTurtleParser[RL],
) -> Result[RdfOut, TurtleError]? {
self.parser.parse_next()
}
///|
pub fn[RL] LowLevelTurtleParser::prefixes(
self : LowLevelTurtleParser[RL],
) -> TurtlePrefixesIter {
match self.parser.context {
RdfContext::N3RecognizerContext(ctx) => { inner: ctx.prefixes.iter() }
_ => { inner: {}.iter() }
}
}
///|
pub fn[RL] LowLevelTurtleParser::base_iri(
self : LowLevelTurtleParser[RL],
) -> String? {
match self.parser.context {
RdfContext::N3RecognizerContext(ctx) =>
ctx.lexer_options.base_iri.map(fn(iri) { iri.to_string() })
_ => None
}
}
///|
pub struct TurtlePrefixesIter {
inner : Iter2[String, Iri]
}
///|
pub struct TurtleSerializer {
mut inner : TriGSerializer
} derive(Default)
///|
pub fn TurtleSerializer::new() -> TurtleSerializer {
TurtleSerializer::default()
}
///|
pub fn TurtleSerializer::with_prefix(
self : TurtleSerializer,
prefix_name : String,
prefix_iri : IriRef,
) -> Result[TurtleSerializer, IriError] {
match self.inner.with_prefix(prefix_name, prefix_iri) {
Ok(new_inner) => {
self.inner = new_inner
Ok(self)
}
Err(e) => Err(e)
}
}
///|
pub fn TurtleSerializer::with_base_iri(
self : TurtleSerializer,
base_iri : IriRef,
) -> Result[TurtleSerializer, IriError] {
match self.inner.with_base_iri(base_iri) {
Ok(new_inner) => {
self.inner = new_inner
Ok(self)
}
Err(e) => Err(e)
}
}
///|
pub fn[W] TurtleSerializer::for_writer(
self : TurtleSerializer,
writer : W,
) -> WriterTurtleSerializer[W] {
{ inner: self.inner.for_writer(writer) }
}
///|
pub fn[W] TurtleSerializer::for_async_writer(
self : TurtleSerializer,
writer : BufferedWriter[W],
) -> AsyncWriterTurtleSerializer[W] {
{ buffer_writer: writer, low_level_writer: self.low_level().inner }
}
///|
pub fn TurtleSerializer::low_level(
self : TurtleSerializer,
) -> LowLevelTurtleSerializer {
{ inner: self.inner.low_level() }
}
///|
pub struct WriterTurtleSerializer[W] {
inner : WriterTriGSerializer[W]
}
///|
pub fn[W] WriterTurtleSerializer::serialize_triple(
self : WriterTurtleSerializer[W],
t : Triple,
) -> Result[String, Unit] {
self.inner.serialize_quad(t.in_graph(GraphNameRef::DefaultGraph))
}
///|
pub fn[W] WriterTurtleSerializer::finish(self : WriterTurtleSerializer[W]) -> W {
self.inner.finish()
}
///|
pub struct AsyncWriterTurtleSerializer[W] {
buffer_writer : BufferedWriter[W]
low_level_writer : LowLevelTriGSerializer
}
///|
pub fn[W] AsyncWriterTurtleSerializer::serialize_triple(
self : AsyncWriterTurtleSerializer[W],
t : Triple,
) -> Result[String, Unit] {
// 修复:使用正确的字段 low_level_writer 调用 serialize_quad
self.low_level_writer.serialize_quad(t.in_graph(GraphNameRef::DefaultGraph))
}
///|
pub async fn[W] AsyncWriterTurtleSerializer::finish(
self : AsyncWriterTurtleSerializer[W],
) -> W {
self.finish()
}
///|
pub struct LowLevelTurtleSerializer {
inner : LowLevelTriGSerializer
}
///|
pub fn LowLevelTurtleSerializer::serialize_triple(
self : LowLevelTurtleSerializer,
t : Triple,
) -> Result[String, Unit] {
self.inner.serialize_quad(t.in_graph(GraphNameRef::DefaultGraph))
}
///|
pub async fn[W : Writer] LowLevelTurtleSerializer::finish(
self : LowLevelTurtleSerializer,
writer : BufferedWriter[W],
) -> Result[Unit, Unit] {
self.inner.finish(writer)
}