linked_data_core/
lib.rs

1use proc_macro2::{Span, TokenStream};
2use quote::ToTokens;
3use snafu::Snafu;
4
5mod attributes;
6mod prefix_mappings;
7mod rdf_metadata;
8
9pub use crate::attributes::variant::PredicatePath;
10pub use crate::rdf_metadata::{RdfEnum, RdfField, RdfStruct, RdfType, RdfVariant};
11
12pub trait TokenGenerator: Sized {
13  fn generate_type_tokens(linked_data_type: &RdfType<Self>, tokens: &mut TokenStream);
14
15  fn generate_struct_tokens(r#struct: &RdfStruct<Self>, tokens: &mut TokenStream);
16
17  fn generate_enum_tokens(r#enum: &RdfEnum<Self>, tokens: &mut TokenStream);
18
19  fn generate_variant_tokens(variant: &RdfVariant<Self>, tokens: &mut TokenStream);
20
21  fn generate_field_tokens(field: &RdfField<Self>, tokens: &mut TokenStream);
22}
23
24impl<G: TokenGenerator> ToTokens for RdfType<G> {
25  fn to_tokens(&self, tokens: &mut TokenStream) {
26    G::generate_type_tokens(self, tokens)
27  }
28}
29
30impl<F: TokenGenerator> ToTokens for RdfEnum<F> {
31  fn to_tokens(&self, tokens: &mut TokenStream) {
32    F::generate_enum_tokens(self, tokens)
33  }
34}
35
36impl<F: TokenGenerator> ToTokens for RdfStruct<F> {
37  fn to_tokens(&self, tokens: &mut TokenStream) {
38    F::generate_struct_tokens(self, tokens)
39  }
40}
41
42impl<F: TokenGenerator> ToTokens for RdfVariant<F> {
43  fn to_tokens(&self, tokens: &mut TokenStream) {
44    F::generate_variant_tokens(self, tokens)
45  }
46}
47
48impl<F: TokenGenerator> ToTokens for RdfField<F> {
49  fn to_tokens(&self, tokens: &mut TokenStream) {
50    F::generate_field_tokens(self, tokens)
51  }
52}
53
54#[derive(Debug, Snafu)]
55pub enum Error {
56  #[snafu(display("union types are not supported"))]
57  UnionType { span: Span },
58
59  #[snafu(display("unit variants are not supported"))]
60  UnitVariant { span: Span },
61
62  #[snafu(display("struct variants are not supported"))]
63  StructVariant { span: Span },
64
65  #[snafu(transparent)]
66  MalformedAttribute { source: syn::Error },
67
68  #[snafu(display("type attribute is only allowed once"))]
69  MultipleTypes { span: Span },
70
71  #[snafu(display("multiple path IRIs defined"))]
72  MultipleIris { span: Span },
73
74  #[snafu(display("missing IRI path"))]
75  MissingIriAttribute { span: Span },
76
77  #[snafu(display("{source}"))]
78  InvalidIri {
79    source: iref::InvalidIri<String>,
80    span: Span,
81  },
82
83  #[snafu(display("{source}"))]
84  InvalidMapping {
85    source: prefix_mappings::Error,
86    span: Span,
87  },
88}
89
90impl Error {
91  fn span(&self) -> Span {
92    match self {
93      Error::UnionType { span } => *span,
94      Error::UnitVariant { span } => *span,
95      Error::StructVariant { span } => *span,
96      Error::MalformedAttribute { source } => source.span(),
97      Error::InvalidIri { span, .. } => *span,
98      Error::InvalidMapping { span, .. } => *span,
99      Error::MultipleTypes { span } => *span,
100      Error::MultipleIris { span } => *span,
101      Error::MissingIriAttribute { span } => *span,
102    }
103  }
104}