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}