Skip to main content

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("struct variants are not supported"))]
60  StructVariant { span: Span },
61
62  #[snafu(display(
63    "an enum must either have only unit variants (a closed list of RDF resources) or only \
64    single-field variants (a tagged union); mixing both is not supported"
65  ))]
66  MixedVariantKinds { span: Span },
67
68  #[snafu(transparent)]
69  MalformedAttribute { source: syn::Error },
70
71  #[snafu(display("type attribute is only allowed once"))]
72  MultipleTypes { span: Span },
73
74  #[snafu(display("multiple path IRIs defined"))]
75  MultipleIris { span: Span },
76
77  #[snafu(display("missing IRI path"))]
78  MissingIriAttribute { span: Span },
79
80  #[snafu(display("{source}"))]
81  InvalidIri {
82    source: oxiri::IriParseError,
83    span: Span,
84  },
85
86  #[snafu(display("{source}"))]
87  InvalidMapping {
88    source: prefix_mappings::Error,
89    span: Span,
90  },
91}
92
93impl Error {
94  fn span(&self) -> Span {
95    match self {
96      Error::UnionType { span } => *span,
97      Error::StructVariant { span } => *span,
98      Error::MixedVariantKinds { span } => *span,
99      Error::MalformedAttribute { source } => source.span(),
100      Error::InvalidIri { span, .. } => *span,
101      Error::InvalidMapping { span, .. } => *span,
102      Error::MultipleTypes { span } => *span,
103      Error::MultipleIris { span } => *span,
104      Error::MissingIriAttribute { span } => *span,
105    }
106  }
107}