1use crate::{
2 lexing::{self, Delimiter, Keyword, Punct, Token, Tokens},
3 Collection, Lexer, RdfLiteral,
4};
5use decoded_char::DecodedChar;
6use locspan::{Meta, Span};
7
8#[derive(Debug, thiserror::Error)]
10pub enum Unexpected {
11 #[error("unexpected token `{0}`")]
12 Token(Token),
13
14 #[error("unexpected end of file")]
15 EndOfFile,
16}
17
18impl From<Option<Token>> for Unexpected {
19 fn from(value: Option<Token>) -> Self {
20 match value {
21 Some(token) => Unexpected::Token(token),
22 None => Unexpected::EndOfFile,
23 }
24 }
25}
26
27#[derive(Debug, thiserror::Error)]
28pub enum Error<E> {
29 #[error(transparent)]
30 Lexer(E),
31
32 #[error(transparent)]
33 Unexpected(Unexpected),
34}
35
36pub type MetaError<E, M> = Meta<Box<Error<E>>, M>;
37
38pub trait Parse<M>: Sized {
39 #[allow(clippy::type_complexity)]
40 fn parse_with<L, F>(parser: &mut Parser<L, F>) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
41 where
42 L: Tokens,
43 F: FnMut(Span) -> M,
44 {
45 match parser.next()? {
46 Meta(Some(token), span) => Self::parse_from(parser, Meta(token, span)),
47 Meta(None, span) => Self::parse_empty::<L>(parser.build_metadata(span)),
48 }
49 }
50
51 #[allow(clippy::type_complexity)]
52 fn parse_from<L, F>(
53 parser: &mut Parser<L, F>,
54 token: Meta<Token, Span>,
55 ) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
56 where
57 L: Tokens,
58 F: FnMut(Span) -> M;
59
60 #[allow(clippy::type_complexity)]
61 fn parse_empty<L>(meta: M) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
62 where
63 L: Tokens,
64 {
65 Err(Meta(
66 Box::new(Error::Unexpected(Unexpected::EndOfFile)),
67 meta,
68 ))
69 }
70
71 #[inline(always)]
72 fn parse<C, F, E>(
73 chars: C,
74 metadata_builder: F,
75 ) -> Result<Meta<Self, M>, MetaError<lexing::Error<E>, M>>
76 where
77 C: Iterator<Item = Result<DecodedChar, E>>,
78 F: FnMut(Span) -> M,
79 {
80 let mut parser = Parser::new(Lexer::new(chars), metadata_builder);
81 Self::parse_with(&mut parser)
82 }
83
84 #[inline(always)]
85 fn parse_infallible<C, F>(
86 chars: C,
87 metadata_builder: F,
88 ) -> Result<Meta<Self, M>, MetaError<lexing::Error, M>>
89 where
90 C: Iterator<Item = DecodedChar>,
91 F: FnMut(Span) -> M,
92 {
93 Self::parse(chars.map(Ok), metadata_builder)
94 }
95
96 #[inline(always)]
97 fn parse_utf8<C, F, E>(
98 chars: C,
99 metadata_builder: F,
100 ) -> Result<Meta<Self, M>, MetaError<lexing::Error<E>, M>>
101 where
102 C: Iterator<Item = Result<char, E>>,
103 F: FnMut(Span) -> M,
104 {
105 Self::parse(
106 decoded_char::FallibleUtf8Decoded::new(chars),
107 metadata_builder,
108 )
109 }
110
111 #[inline(always)]
112 fn parse_utf8_infallible<C, F>(
113 chars: C,
114 metadata_builder: F,
115 ) -> Result<Meta<Self, M>, MetaError<lexing::Error, M>>
116 where
117 C: Iterator<Item = char>,
118 F: FnMut(Span) -> M,
119 {
120 Self::parse_infallible(decoded_char::Utf8Decoded::new(chars), metadata_builder)
121 }
122
123 #[inline(always)]
124 fn parse_utf16<C, F, E>(
125 chars: C,
126 metadata_builder: F,
127 ) -> Result<Meta<Self, M>, MetaError<lexing::Error<E>, M>>
128 where
129 C: Iterator<Item = Result<char, E>>,
130 F: FnMut(Span) -> M,
131 {
132 Self::parse(
133 decoded_char::FallibleUtf16Decoded::new(chars),
134 metadata_builder,
135 )
136 }
137
138 #[inline(always)]
139 fn parse_utf16_infallible<C, F>(
140 chars: C,
141 metadata_builder: F,
142 ) -> Result<Meta<Self, M>, MetaError<lexing::Error, M>>
143 where
144 C: Iterator<Item = char>,
145 F: FnMut(Span) -> M,
146 {
147 Self::parse_infallible(decoded_char::Utf16Decoded::new(chars), metadata_builder)
148 }
149
150 #[inline(always)]
151 fn parse_str<F>(
152 string: &str,
153 metadata_builder: F,
154 ) -> Result<Meta<Self, M>, MetaError<lexing::Error, M>>
155 where
156 F: FnMut(Span) -> M,
157 {
158 Self::parse_utf8_infallible(string.chars(), metadata_builder)
159 }
160}
161
162pub struct Parser<L, F> {
163 lexer: L,
164 metadata_builder: F,
165}
166
167impl<L, F> Parser<L, F> {
168 pub fn new(lexer: L, metadata_builder: F) -> Self {
169 Self {
170 lexer,
171 metadata_builder,
172 }
173 }
174}
175
176impl<L: Tokens, F: FnMut(Span) -> M, M> Parser<L, F> {
177 fn next(&mut self) -> Result<Meta<Option<Token>, Span>, MetaError<L::Error, M>> {
178 self.lexer
179 .next()
180 .map_err(|Meta(e, span)| Meta(Box::new(Error::Lexer(e)), (self.metadata_builder)(span)))
181 }
182
183 #[allow(clippy::type_complexity)]
184 fn peek(&mut self) -> Result<Meta<Option<&Token>, Span>, MetaError<L::Error, M>> {
185 self.lexer
186 .peek()
187 .map_err(|Meta(e, span)| Meta(Box::new(Error::Lexer(e)), (self.metadata_builder)(span)))
188 }
189
190 fn last_span(&self) -> Span {
191 self.lexer.last()
192 }
193
194 fn build_metadata(&mut self, span: Span) -> M {
195 (self.metadata_builder)(span)
196 }
197}
198
199impl<M> Parse<M> for crate::Document<M> {
200 fn parse_from<L, F>(
201 parser: &mut Parser<L, F>,
202 Meta(token, mut span): Meta<Token, Span>,
203 ) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
204 where
205 L: Tokens,
206 F: FnMut(Span) -> M,
207 {
208 let mut result = crate::Document::default();
209 result.insert(crate::Statement::parse_from(parser, Meta(token, span))?);
210
211 while let Meta(Some(token), span) = parser.next()? {
212 result.insert(crate::Statement::parse_from(parser, Meta(token, span))?)
213 }
214
215 span.append(parser.last_span());
216 Ok(Meta(result, parser.build_metadata(span)))
217 }
218
219 fn parse_empty<L>(meta: M) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
220 where
221 L: Tokens,
222 {
223 Ok(Meta(Self::new(), meta))
224 }
225}
226
227impl<M> Parse<M> for crate::Directive<M> {
228 fn parse_from<L, F>(
229 parser: &mut Parser<L, F>,
230 Meta(token, mut span): Meta<Token, Span>,
231 ) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
232 where
233 L: Tokens,
234 F: FnMut(Span) -> M,
235 {
236 match token {
237 Token::Keyword(Keyword::Prefix) => match parser.next()? {
238 Meta(Some(Token::CompactIri((namespace, ns_span), (suffix, suffix_span))), _) => {
239 if suffix.is_empty() {
240 match parser.next()? {
241 Meta(Some(Token::IriRef(iri_ref)), iri_ref_span) => {
242 match parser.next()? {
243 Meta(Some(Token::Punct(Punct::Period)), dot_span) => {
244 span.append(dot_span);
245 Ok(Meta(
246 crate::Directive::Prefix(
247 Meta(namespace, parser.build_metadata(ns_span)),
248 Meta(iri_ref, parser.build_metadata(iri_ref_span)),
249 ),
250 parser.build_metadata(span),
251 ))
252 }
253 Meta(unexpected, span) => Err(Meta(
254 Box::new(Error::Unexpected(unexpected.into())),
255 parser.build_metadata(span),
256 )),
257 }
258 }
259 Meta(unexpected, span) => Err(Meta(
260 Box::new(Error::Unexpected(unexpected.into())),
261 parser.build_metadata(span),
262 )),
263 }
264 } else {
265 Err(Meta(
266 Box::new(Error::Unexpected(
267 Some(Token::CompactIri(
268 (namespace, ns_span),
269 (suffix, suffix_span),
270 ))
271 .into(),
272 )),
273 parser.build_metadata(span),
274 ))
275 }
276 }
277 Meta(unexpected, span) => Err(Meta(
278 Box::new(Error::Unexpected(unexpected.into())),
279 parser.build_metadata(span),
280 )),
281 },
282 Token::Keyword(Keyword::Base) => match parser.next()? {
283 Meta(Some(Token::IriRef(iri_ref)), iri_ref_span) => match parser.next()? {
284 Meta(Some(Token::Punct(Punct::Period)), dot_span) => {
285 span.append(dot_span);
286 Ok(Meta(
287 crate::Directive::Base(Meta(
288 iri_ref,
289 parser.build_metadata(iri_ref_span),
290 )),
291 parser.build_metadata(span),
292 ))
293 }
294 Meta(unexpected, span) => Err(Meta(
295 Box::new(Error::Unexpected(unexpected.into())),
296 parser.build_metadata(span),
297 )),
298 },
299 Meta(unexpected, span) => Err(Meta(
300 Box::new(Error::Unexpected(unexpected.into())),
301 parser.build_metadata(span),
302 )),
303 },
304 Token::Keyword(Keyword::SparqlPrefix) => match parser.next()? {
305 Meta(Some(Token::CompactIri((namespace, ns_span), (suffix, suffix_span))), _) => {
306 if suffix.is_empty() {
307 match parser.next()? {
308 Meta(Some(Token::IriRef(iri_ref)), iri_ref_span) => {
309 span.append(iri_ref_span);
310 Ok(Meta(
311 crate::Directive::SparqlPrefix(
312 Meta(namespace, parser.build_metadata(ns_span)),
313 Meta(iri_ref, parser.build_metadata(iri_ref_span)),
314 ),
315 parser.build_metadata(span),
316 ))
317 }
318 Meta(unexpected, span) => Err(Meta(
319 Box::new(Error::Unexpected(unexpected.into())),
320 parser.build_metadata(span),
321 )),
322 }
323 } else {
324 Err(Meta(
325 Box::new(Error::Unexpected(
326 Some(Token::CompactIri(
327 (namespace, ns_span),
328 (suffix, suffix_span),
329 ))
330 .into(),
331 )),
332 parser.build_metadata(span),
333 ))
334 }
335 }
336 Meta(unexpected, span) => Err(Meta(
337 Box::new(Error::Unexpected(unexpected.into())),
338 parser.build_metadata(span),
339 )),
340 },
341 Token::Keyword(Keyword::SparqlBase) => match parser.next()? {
342 Meta(Some(Token::IriRef(iri_ref)), iri_ref_span) => {
343 span.append(iri_ref_span);
344 Ok(Meta(
345 crate::Directive::SparqlBase(Meta(
346 iri_ref,
347 parser.build_metadata(iri_ref_span),
348 )),
349 parser.build_metadata(span),
350 ))
351 }
352 Meta(unexpected, span) => Err(Meta(
353 Box::new(Error::Unexpected(unexpected.into())),
354 parser.build_metadata(span),
355 )),
356 },
357 unexpected => Err(Meta(
358 Box::new(Error::Unexpected(Unexpected::Token(unexpected))),
359 parser.build_metadata(span),
360 )),
361 }
362 }
363}
364
365impl<M> Parse<M> for crate::Statement<M> {
366 fn parse_from<L, F>(
367 parser: &mut Parser<L, F>,
368 Meta(token, span): Meta<Token, Span>,
369 ) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
370 where
371 L: Tokens,
372 F: FnMut(Span) -> M,
373 {
374 match token {
375 token @ Token::Keyword(
376 Keyword::Prefix | Keyword::Base | Keyword::SparqlPrefix | Keyword::SparqlBase,
377 ) => Ok(crate::Directive::parse_from(parser, Meta(token, span))?.map(Self::Directive)),
378 token => {
379 let Meta(triples, meta) = crate::Triples::parse_from(parser, Meta(token, span))?;
380 Ok(Meta(crate::Statement::Triples(triples), meta))
381 }
382 }
383 }
384}
385
386impl<M> Parse<M> for crate::Triples<M> {
387 fn parse_from<L, F>(
388 parser: &mut Parser<L, F>,
389 Meta(token, mut span): Meta<Token, Span>,
390 ) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
391 where
392 L: Tokens,
393 F: FnMut(Span) -> M,
394 {
395 let subject = crate::Subject::parse_from(parser, Meta(token, span))?;
396
397 let po_list = match parser.peek()? {
398 Meta(Some(Token::Punct(Punct::Period)), p_span) => {
399 if !matches!(&subject, Meta(crate::Subject::BlankNode(crate::BlankNode::Anonymous(l)), _) if !l.is_empty())
400 {
401 return Err(Meta(
402 Box::new(Error::Unexpected(Unexpected::Token(Token::Punct(
403 Punct::Period,
404 )))),
405 parser.build_metadata(p_span),
406 ));
407 }
408
409 let span = parser.last_span().next();
410 Meta(Vec::new(), parser.build_metadata(span))
411 }
412 _ => Vec::parse_with(parser)?,
413 };
414
415 span.append(parser.last_span());
416
417 match parser.next()? {
418 Meta(Some(Token::Punct(Punct::Period)), _) => (),
419 Meta(unexpected, span) => {
420 return Err(Meta(
421 Box::new(Error::Unexpected(unexpected.into())),
422 parser.build_metadata(span),
423 ));
424 }
425 }
426
427 Ok(Meta(
428 crate::Triples {
429 subject,
430 predicate_objects_list: po_list,
431 },
432 parser.build_metadata(span),
433 ))
434 }
435}
436
437impl<M> Parse<M> for Vec<Meta<crate::PredicateObjects<M>, M>> {
438 fn parse_from<L, F>(
439 parser: &mut Parser<L, F>,
440 Meta(token, span): Meta<Token, Span>,
441 ) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
442 where
443 L: Tokens,
444 F: FnMut(Span) -> M,
445 {
446 let mut result = vec![crate::PredicateObjects::parse_from(
447 parser,
448 Meta(token, span),
449 )?];
450
451 loop {
452 match parser.peek()? {
453 Meta(Some(Token::Punct(Punct::Semicolon)), _) => {
454 parser.next()?;
455
456 match parser.peek()? {
457 Meta(
458 Some(Token::Punct(Punct::Period) | Token::End(Delimiter::Bracket)),
459 _,
460 ) => break,
461 _ => result.push(crate::PredicateObjects::parse_with(parser)?),
462 }
463 }
464 Meta(Some(Token::Punct(Punct::Period) | Token::End(Delimiter::Bracket)), _) => {
465 break
466 }
467 _ => {
468 let Meta(unexpected, span) = parser.next()?;
469 return Err(Meta(
470 Box::new(Error::Unexpected(unexpected.into())),
471 parser.build_metadata(span),
472 ));
473 }
474 }
475 }
476
477 Ok(Meta(result, parser.build_metadata(span)))
478 }
479}
480
481impl<M> Parse<M> for crate::PredicateObjects<M> {
482 fn parse_from<L, F>(
483 parser: &mut Parser<L, F>,
484 Meta(token, mut span): Meta<Token, Span>,
485 ) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
486 where
487 L: Tokens,
488 F: FnMut(Span) -> M,
489 {
490 let verb = crate::Verb::parse_from(parser, Meta(token, span))?;
491 let objects = crate::Objects::parse_with(parser)?;
492 span.append(parser.last_span());
493 Ok(Meta(Self { verb, objects }, parser.build_metadata(span)))
494 }
495}
496
497impl<M> Parse<M> for crate::Objects<M> {
498 fn parse_from<L, F>(
499 parser: &mut Parser<L, F>,
500 Meta(token, span): Meta<Token, Span>,
501 ) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
502 where
503 L: Tokens,
504 F: FnMut(Span) -> M,
505 {
506 let mut result = vec![crate::Object::parse_from(parser, Meta(token, span))?];
507
508 loop {
509 match parser.peek()? {
510 Meta(Some(Token::Punct(Punct::Comma)), _) => {
511 parser.next()?;
512 result.push(crate::Object::parse_with(parser)?);
513 }
514 Meta(
515 Some(
516 Token::Punct(Punct::Period | Punct::Semicolon)
517 | Token::End(Delimiter::Bracket),
518 ),
519 _,
520 ) => break,
521 _ => {
522 let Meta(unexpected, span) = parser.next()?;
523 return Err(Meta(
524 Box::new(Error::Unexpected(unexpected.into())),
525 parser.build_metadata(span),
526 ));
527 }
528 }
529 }
530
531 Ok(Meta(Self(result), parser.build_metadata(span)))
532 }
533}
534
535fn compact_iri<M, L, F>(
536 parser: &mut Parser<L, F>,
537 (prefix, prefix_span): (String, Span),
538 (suffix, suffix_span): (String, Span),
539) -> crate::Iri<M>
540where
541 L: Tokens,
542 F: FnMut(Span) -> M,
543{
544 crate::Iri::Compact(
545 Meta(prefix, parser.build_metadata(prefix_span)),
546 Meta(suffix, parser.build_metadata(suffix_span)),
547 )
548}
549
550impl<M> Parse<M> for crate::Subject<M> {
551 fn parse_from<L, F>(
552 parser: &mut Parser<L, F>,
553 Meta(token, mut span): Meta<Token, Span>,
554 ) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
555 where
556 L: Tokens,
557 F: FnMut(Span) -> M,
558 {
559 match token {
560 Token::IriRef(iri_ref) => Ok(Meta(
561 crate::Subject::Iri(crate::Iri::IriRef(iri_ref)),
562 parser.build_metadata(span),
563 )),
564 Token::CompactIri(prefix, suffix) => Ok(Meta(
565 crate::Subject::Iri(compact_iri(parser, prefix, suffix)),
566 parser.build_metadata(span),
567 )),
568 Token::BlankNodeLabel(label) => Ok(Meta(
569 crate::Subject::BlankNode(crate::BlankNode::Label(label)),
570 parser.build_metadata(span),
571 )),
572 Token::Begin(Delimiter::Bracket) => {
573 let po_list = match parser.peek()? {
574 Meta(Some(Token::End(Delimiter::Bracket)), _) => {
575 let span = parser.last_span().next();
576 Meta(Vec::new(), parser.build_metadata(span))
577 }
578 _ => Vec::parse_with(parser)?,
579 };
580
581 match parser.next()? {
582 Meta(Some(Token::End(Delimiter::Bracket)), _) => (),
583 Meta(unexpected, span) => {
584 return Err(Meta(
585 Box::new(Error::Unexpected(unexpected.into())),
586 parser.build_metadata(span),
587 ));
588 }
589 }
590
591 span.append(parser.last_span());
592 Ok(Meta(
593 crate::Subject::BlankNode(crate::BlankNode::Anonymous(po_list)),
594 parser.build_metadata(span),
595 ))
596 }
597 Token::Begin(Delimiter::Parenthesis) => {
598 let Meta(objects, meta) = Collection::parse_from(parser, Meta(token, span))?;
599 Ok(Meta(crate::Subject::Collection(objects), meta))
600 }
601 unexpected => Err(Meta(
602 Box::new(Error::Unexpected(Unexpected::Token(unexpected))),
603 parser.build_metadata(span),
604 )),
605 }
606 }
607}
608
609impl<M> Parse<M> for Collection<M> {
610 fn parse_from<L, F>(
611 parser: &mut Parser<L, F>,
612 Meta(token, mut span): Meta<Token, Span>,
613 ) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
614 where
615 L: Tokens,
616 F: FnMut(Span) -> M,
617 {
618 match token {
619 Token::Begin(Delimiter::Parenthesis) => {
620 let mut objects = Vec::new();
621
622 loop {
623 match parser.next()? {
624 Meta(Some(Token::End(Delimiter::Parenthesis)), end_span) => {
625 span.append(end_span);
626 break;
627 }
628 Meta(Some(token), span) => {
629 let object = crate::Object::parse_from(parser, Meta(token, span))?;
630 objects.push(object)
631 }
632 Meta(unexpected, span) => {
633 return Err(Meta(
634 Box::new(Error::Unexpected(unexpected.into())),
635 parser.build_metadata(span),
636 ))
637 }
638 }
639 }
640
641 Ok(Meta(Collection(objects), parser.build_metadata(span)))
642 }
643 unexpected => Err(Meta(
644 Box::new(Error::Unexpected(Unexpected::Token(unexpected))),
645 parser.build_metadata(span),
646 )),
647 }
648 }
649}
650
651impl<M> Parse<M> for crate::Object<M> {
652 fn parse_from<L, F>(
653 parser: &mut Parser<L, F>,
654 Meta(token, mut span): Meta<Token, Span>,
655 ) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
656 where
657 L: Tokens,
658 F: FnMut(Span) -> M,
659 {
660 match token {
661 Token::IriRef(iri_ref) => Ok(Meta(
662 crate::Object::Iri(crate::Iri::IriRef(iri_ref)),
663 parser.build_metadata(span),
664 )),
665 Token::CompactIri(prefix, suffix) => Ok(Meta(
666 crate::Object::Iri(compact_iri(parser, prefix, suffix)),
667 parser.build_metadata(span),
668 )),
669 Token::BlankNodeLabel(label) => Ok(Meta(
670 crate::Object::BlankNode(crate::BlankNode::Label(label)),
671 parser.build_metadata(span),
672 )),
673 Token::Begin(Delimiter::Bracket) => {
674 let po_list = match parser.peek()? {
675 Meta(Some(Token::End(Delimiter::Bracket)), _) => {
676 let span = parser.last_span().next();
677 Meta(Vec::new(), parser.build_metadata(span))
678 }
679 _ => Vec::parse_with(parser)?,
680 };
681
682 match parser.next()? {
683 Meta(Some(Token::End(Delimiter::Bracket)), _) => (),
684 Meta(unexpected, span) => {
685 return Err(Meta(
686 Box::new(Error::Unexpected(unexpected.into())),
687 parser.build_metadata(span),
688 ));
689 }
690 }
691
692 span.append(parser.last_span());
693 Ok(Meta(
694 crate::Object::BlankNode(crate::BlankNode::Anonymous(po_list)),
695 parser.build_metadata(span),
696 ))
697 }
698 Token::Begin(Delimiter::Parenthesis) => {
699 let Meta(objects, meta) = Collection::parse_from(parser, Meta(token, span))?;
700 Ok(Meta(crate::Object::Collection(objects), meta))
701 }
702 token => {
703 let Meta(literal, meta) = crate::Literal::parse_from(parser, Meta(token, span))?;
704 Ok(Meta(crate::Object::Literal(literal), meta))
705 }
706 }
707 }
708}
709
710const XSD_STRING: iref::Iri<'static> = static_iref::iri!("http://www.w3.org/2001/XMLSchema#string");
711
712#[allow(clippy::type_complexity)]
713fn parse_rdf_literal<M, L, F>(
714 parser: &mut Parser<L, F>,
715 Meta(string, string_span): Meta<String, Span>,
716) -> Result<Meta<RdfLiteral<M>, M>, MetaError<L::Error, M>>
717where
718 L: Tokens,
719 F: FnMut(Span) -> M,
720{
721 match parser.peek()? {
722 Meta(Some(Token::LangTag(_)), tag_span) => {
723 let tag = match parser.next()? {
724 Meta(Some(Token::LangTag(tag)), _) => tag,
725 _ => panic!("expected lang tag"),
726 };
727
728 let span = string_span.union(tag_span);
729 Ok(Meta(
730 RdfLiteral::new(
731 Meta(string, parser.build_metadata(string_span)),
732 Meta(
733 rdf_types::literal::Type::LangString(tag),
734 parser.build_metadata(tag_span),
735 ),
736 ),
737 parser.build_metadata(span),
738 ))
739 }
740 Meta(Some(Token::Punct(Punct::Carets)), _) => {
741 parser.next()?;
742 let iri = crate::Iri::parse_with(parser)?.map(rdf_types::literal::Type::Any);
743 let span = string_span.union(parser.last_span());
744 Ok(Meta(
745 RdfLiteral::new(Meta(string, parser.build_metadata(string_span)), iri),
746 parser.build_metadata(span),
747 ))
748 }
749 _ => {
750 let ty = Meta(
751 rdf_types::literal::Type::Any(crate::Iri::IriRef(XSD_STRING.to_owned().into())),
752 parser.build_metadata(string_span),
753 );
754 Ok(Meta(
755 RdfLiteral::new(Meta(string, parser.build_metadata(string_span)), ty),
756 parser.build_metadata(string_span),
757 ))
758 }
759 }
760}
761
762impl<M> Parse<M> for crate::Literal<M> {
763 fn parse_from<L, F>(
764 parser: &mut Parser<L, F>,
765 Meta(token, span): Meta<Token, Span>,
766 ) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
767 where
768 L: Tokens,
769 F: FnMut(Span) -> M,
770 {
771 match token {
772 Token::StringLiteral(string) => {
773 let Meta(lit, loc) = parse_rdf_literal(parser, Meta(string, span))?;
774 Ok(Meta(crate::Literal::Rdf(lit), loc))
775 }
776 Token::Numeric(n) => Ok(Meta(
777 crate::Literal::Numeric(n),
778 parser.build_metadata(span),
779 )),
780 Token::Keyword(Keyword::True) => Ok(Meta(
781 crate::Literal::Boolean(true),
782 parser.build_metadata(span),
783 )),
784 Token::Keyword(Keyword::False) => Ok(Meta(
785 crate::Literal::Boolean(false),
786 parser.build_metadata(span),
787 )),
788 unexpected => Err(Meta(
789 Box::new(Error::Unexpected(Unexpected::Token(unexpected))),
790 parser.build_metadata(span),
791 )),
792 }
793 }
794}
795
796impl<M> Parse<M> for crate::Verb<M> {
797 fn parse_from<L, F>(
798 parser: &mut Parser<L, F>,
799 Meta(token, span): Meta<Token, Span>,
800 ) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
801 where
802 L: Tokens,
803 F: FnMut(Span) -> M,
804 {
805 match token {
806 Token::Keyword(Keyword::A) => Ok(Meta(crate::Verb::A, parser.build_metadata(span))),
807 token => {
808 let Meta(iri, meta) = crate::Iri::parse_from(parser, Meta(token, span))?;
809 Ok(Meta(crate::Verb::Predicate(iri), meta))
810 }
811 }
812 }
813}
814
815impl<M> Parse<M> for crate::Iri<M> {
816 fn parse_from<L, F>(
817 parser: &mut Parser<L, F>,
818 Meta(token, span): Meta<Token, Span>,
819 ) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
820 where
821 L: Tokens,
822 F: FnMut(Span) -> M,
823 {
824 match token {
825 Token::IriRef(iri_ref) => Ok(Meta(
826 crate::Iri::IriRef(iri_ref),
827 parser.build_metadata(span),
828 )),
829 Token::CompactIri(prefix, suffix) => Ok(Meta(
830 compact_iri(parser, prefix, suffix),
831 parser.build_metadata(span),
832 )),
833 unexpected => Err(Meta(
834 Box::new(Error::Unexpected(Unexpected::Token(unexpected))),
835 parser.build_metadata(span),
836 )),
837 }
838 }
839}