shex_compact/
compact_printer.rs

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        // use std::borrow::Borrow;
80        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}