Skip to content

GordianDziwis/linked-data-core

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

linked-data-core

This library provides the infrastructure for derive macros to extract RDF metadata from attributes and generate serialization/deserialization code.

  • Defines RDF attributes for Rust types
  • Parses RDF attributes to a structured RDF metadata representation metadata::RdfType
  • Provides a trait TokenGenerator that authors can implement in a derive macro to generate code based on the metadata from metadata::RdfType

Usage

The linked-data-sparql repository has an implementation.

  1. Annotate a type:

    #[ld(type = "http://schema.org/Person")]
    #[ld(prefix("schema" = "http://schema.org/"))]
    struct Person {
        #[ld("schema:name")]
        name: String,
    }
  2. To generate code:

    use linked_data_core::{
        PredicatePath, RdfEnum, RdfField, RdfStruct, RdfType, RdfVariant,
        TokenGenerator,
    };
    use proc_macro_error::proc_macro_error;
    use proc_macro2::TokenStream;
    use quote::ToTokens;
    use syn::DeriveInput;
    
    #[proc_macro_derive(MyDerive, attributes(ld))]
    pub fn derive_my_trait(
        item: proc_macro::TokenStream,
    ) -> proc_macro::TokenStream {
        let raw_input = syn::parse_macro_input!(item as DeriveInput);
        let linked_data_type: RdfType<MyGenerator> = RdfType::from_derive(raw_input);
    
        let mut output = TokenStream::new();
        linked_data_type.to_tokens(&mut output);
        output.into()
    }
    
    struct MyGenerator;
    
    impl TokenGenerator for MyGenerator {
        fn generate_struct_tokens(rdf_struct: &RdfStruct<Self>, tokens: &mut TokenStream) {
            // Use rdf_struct metadata to generate serialization code
            let type_iri = rdf_struct.type_iri();
            let fields = &rdf_struct.fields;
            // Generate your custom code...
        }
    
        fn generate_enum_tokens(rdf_enum: &RdfEnum<Self>, tokens: &mut TokenStream) {
            // Handle enum types
            let variants = &rdf_enum.variants;
            // Generate your custom code...
        }
    }

Attributes

Type-Level Attributes

#[ld(type = "http://schema.org/Person")]        // RDF type for instances
#[ld(prefix("schema" = "http://schema.org/"))]  // Define prefix mappings

Field Attributes

#[ld("http://schema.org/name")]  // RDF predicate IRI
#[ld("schema:name")]             // Using prefix (if defined)
#[ld(id)]                        // Mark as subject/ID field
#[ld(flatten)]                   // Inline nested properties
#[ld(graph)]                     // Contains graph data
#[ld(ignore)]                    // Exclude from RDF
#[ld("http://example.org/hasRole")]  // Simple predicate

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 100.0%