1use colored::*;
2use iri_s::IriS;
3use prefixmap::{IriRef, PrefixMap};
4use pretty::{Arena, DocAllocator, DocBuilder};
5use shex_ast::{object_value::ObjectValue, BNode, ShapeExprLabel};
6use srdf::{literal::Literal, numeric_literal::NumericLiteral};
7use std::borrow::Cow;
8
9pub(crate) fn pp_object_value<'a, A>(
10 v: &ObjectValue,
11 doc: &'a Arena<'a, A>,
12 prefixmap: &PrefixMap,
13) -> DocBuilder<'a, Arena<'a, A>, A> {
14 match v {
15 ObjectValue::IriRef(i) => pp_iri_ref(i, doc, prefixmap),
16 ObjectValue::Literal(Literal::BooleanLiteral(_value)) => {
17 todo!()
18 }
19 ObjectValue::Literal(Literal::NumericLiteral(num)) => pp_numeric_literal(num, doc),
20 ObjectValue::Literal(Literal::DatatypeLiteral { .. }) => todo!(),
21 ObjectValue::Literal(Literal::StringLiteral { .. }) => todo!(),
22 }
23}
24
25pub(crate) fn pp_label<'a, A>(
26 label: &ShapeExprLabel,
27 doc: &'a Arena<'a, A>,
28 prefixmap: &PrefixMap,
29 keyword_color: Option<Color>,
30) -> DocBuilder<'a, Arena<'a, A>, A> {
31 match label {
32 ShapeExprLabel::BNode { value } => pp_bnode(value, doc),
33 ShapeExprLabel::IriRef { value } => pp_iri_ref(value, doc, prefixmap),
34 ShapeExprLabel::Start => keyword("START", doc, keyword_color),
35 }
36}
37
38pub(crate) fn pp_bnode<'a, A>(
39 value: &BNode,
40 doc: &'a Arena<'a, A>,
41) -> DocBuilder<'a, Arena<'a, A>, A> {
42 doc.text(format!("{value}"))
43}
44
45fn pp_numeric_literal<'a, A>(
46 value: &NumericLiteral,
47 doc: &'a Arena<'a, A>,
48) -> DocBuilder<'a, Arena<'a, A>, A> {
49 match value {
50 NumericLiteral::Integer(n) => doc.text(n.to_string()),
51 NumericLiteral::Decimal(decimal) => doc.text(decimal.to_string()),
52 NumericLiteral::Double(d) => doc.text(d.to_string()),
53 }
54}
55
56fn pp_iri_ref<'a, A>(
57 value: &IriRef,
58 doc: &'a Arena<'a, A>,
59 prefixmap: &PrefixMap,
60) -> DocBuilder<'a, Arena<'a, A>, A> {
61 match value {
62 IriRef::Iri(iri) => pp_iri(iri, doc, prefixmap),
63 IriRef::Prefixed { prefix, local } => doc
64 .text(prefix.clone())
65 .append(doc.text(":"))
66 .append(doc.text(local.clone())),
67 }
68}
69
70pub(crate) fn keyword<'a, U, A>(
71 s: U,
72 doc: &'a Arena<'a, A>,
73 color: Option<Color>,
74) -> DocBuilder<'a, Arena<'a, A>, A>
75where
76 U: Into<Cow<'a, str>>,
77{
78 if let Some(color) = color {
79 let data: Cow<str> = s.into();
81 let s: String = match data {
82 Cow::Owned(t) => t,
83 Cow::Borrowed(t) => t.into(),
84 };
85 doc.text(s.as_str().color(color).to_string())
86 } else {
87 doc.text(s)
88 }
89}
90
91fn pp_iri<'a, A>(
92 iri: &IriS,
93 doc: &'a Arena<'a, A>,
94 prefixmap: &PrefixMap,
95) -> DocBuilder<'a, Arena<'a, A>, A> {
96 doc.text(prefixmap.qualify(iri))
97}