Skip to main content

stac_derive/
lib.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{DeriveInput, parse_macro_input};
4
5#[proc_macro_derive(SelfHref)]
6pub fn self_href_derive(input: TokenStream) -> TokenStream {
7    let input = parse_macro_input!(input as DeriveInput);
8    let name = input.ident;
9    let expanded = quote! {
10        impl ::stac::SelfHref for #name {
11            fn self_href(&self) -> Option<&str> {
12                self.self_href.as_deref()
13            }
14            fn self_href_mut(&mut self) -> &mut Option<String> {
15                &mut self.self_href
16            }
17        }
18    };
19    TokenStream::from(expanded)
20}
21
22#[proc_macro_derive(Links)]
23pub fn links_derive(input: TokenStream) -> TokenStream {
24    let input = parse_macro_input!(input as DeriveInput);
25    let name = input.ident;
26    let expanded = quote! {
27        impl ::stac::Links for #name {
28            fn links(&self) -> &[::stac::Link] {
29                &self.links
30            }
31            fn links_mut(&mut self) -> &mut Vec<::stac::Link> {
32                &mut self.links
33            }
34        }
35    };
36    TokenStream::from(expanded)
37}
38
39#[proc_macro_derive(Migrate)]
40pub fn migrate_derive(input: TokenStream) -> TokenStream {
41    let input = parse_macro_input!(input as DeriveInput);
42    let name = input.ident;
43    let expanded = quote! {
44        impl ::stac::Migrate for #name {}
45    };
46    TokenStream::from(expanded)
47}
48
49#[proc_macro_derive(Fields)]
50pub fn fields_derive(input: TokenStream) -> TokenStream {
51    let input = parse_macro_input!(input as DeriveInput);
52    let name = input.ident;
53    let expanded = quote! {
54        impl ::stac::Fields for #name {
55            fn fields(&self) -> &serde_json::Map<String, serde_json::Value> {
56                &self.additional_fields
57            }
58            fn fields_mut(&mut self) -> &mut serde_json::Map<String, Value> {
59                &mut self.additional_fields
60            }
61        }
62    };
63    TokenStream::from(expanded)
64}