#[doc(hidden)]
extern crate proc_macro;
mod implementation;
use proc_macro::TokenStream;
use quote::{ToTokens, quote};
use syn::parse_macro_input;
use crate::implementation::{Params, PortVariant, quote_from_input, quote_from_type, quote_from_value};
#[proc_macro]
pub fn create_port_array(input: TokenStream) -> TokenStream {
let output: proc_macro2::TokenStream = input.into();
quote! {
dataport::PortArray::from_array([#output])
}
.into()
}
#[proc_macro]
pub fn create_port_vec(input: TokenStream) -> TokenStream {
let output: proc_macro2::TokenStream = input.into();
quote! {
dataport::PortVec::from_array([#output])
}
.into()
}
#[proc_macro]
pub fn create_port_map(input: TokenStream) -> TokenStream {
let output: proc_macro2::TokenStream = input.into();
quote! {
dataport::PortMap::from_array([#output])
}
.into()
}
#[proc_macro]
pub fn create_inbound_entry(input: TokenStream) -> TokenStream {
let params = parse_macro_input!(input as Params);
let name = params.port_name;
if let Some(value) = params.port_value {
if let Some(tp) = params.port_type {
quote_from_input(name, tp, value, params.collection, PortVariant::InBound, false).into()
} else {
quote_from_value(PortVariant::InBound, name, value.to_token_stream(), false).into()
}
} else if let Some(tp) = params.port_type {
quote_from_type(PortVariant::InBound, name, tp, false).into()
} else {
panic!("missing type or value as parameter")
}
}
#[proc_macro]
pub fn create_inbound_entry_parseable(input: TokenStream) -> TokenStream {
let params = parse_macro_input!(input as Params);
let name = params.port_name;
if let Some(value) = params.port_value {
if let Some(tp) = params.port_type {
quote_from_input(name, tp, value, params.collection, PortVariant::InBound, true).into()
} else {
quote_from_value(PortVariant::InBound, name, value.to_token_stream(), true).into()
}
} else if let Some(tp) = params.port_type {
quote_from_type(PortVariant::InBound, name, tp, true).into()
} else {
panic!("missing type or value as parameter")
}
}
#[proc_macro]
pub fn create_inoutbound_entry(input: TokenStream) -> TokenStream {
let params = parse_macro_input!(input as Params);
let name = params.port_name;
if let Some(value) = params.port_value {
if let Some(tp) = params.port_type {
quote_from_input(name, tp, value, params.collection, PortVariant::InOutBound, false).into()
} else {
quote_from_value(PortVariant::InOutBound, name, value.to_token_stream(), false).into()
}
} else if let Some(tp) = params.port_type {
quote_from_type(PortVariant::InOutBound, name, tp, false).into()
} else {
panic!("missing type or value as parameter")
}
}
#[proc_macro]
pub fn create_inoutbound_entry_parseable(input: TokenStream) -> TokenStream {
let params = parse_macro_input!(input as Params);
let name = params.port_name;
if let Some(value) = params.port_value {
if let Some(tp) = params.port_type {
quote_from_input(name, tp, value, params.collection, PortVariant::InOutBound, true).into()
} else {
quote_from_value(PortVariant::InOutBound, name, value.to_token_stream(), true).into()
}
} else if let Some(tp) = params.port_type {
quote_from_type(PortVariant::InOutBound, name, tp, true).into()
} else {
panic!("missing type or value as parameter")
}
}
#[proc_macro]
pub fn create_outbound_entry(input: TokenStream) -> TokenStream {
let params = parse_macro_input!(input as Params);
let name = params.port_name;
if let Some(value) = params.port_value {
if let Some(tp) = params.port_type {
quote_from_input(name, tp, value, params.collection, PortVariant::OutBound, false).into()
} else {
quote_from_value(PortVariant::OutBound, name, value.to_token_stream(), false).into()
}
} else if let Some(tp) = params.port_type {
quote_from_type(PortVariant::OutBound, name, tp, false).into()
} else {
panic!("missing type or value as parameter")
}
}
#[proc_macro]
pub fn create_outbound_entry_parseable(input: TokenStream) -> TokenStream {
let params = parse_macro_input!(input as Params);
let name = params.port_name;
if let Some(value) = params.port_value {
if let Some(tp) = params.port_type {
quote_from_input(name, tp, value, params.collection, PortVariant::OutBound, true).into()
} else {
quote_from_value(PortVariant::OutBound, name, value.to_token_stream(), true).into()
}
} else if let Some(tp) = params.port_type {
quote_from_type(PortVariant::OutBound, name, tp, true).into()
} else {
panic!("missing type or value as parameter")
}
}