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}