pso2packetlib_impl/
lib.rs

1mod packet_structs;
2mod protocol_enum;
3use packet_structs::{helper_deriver, packet_deriver};
4use proc_macro::TokenStream;
5use proc_macro2::TokenStream as TS2;
6use protocol_enum::protocol_deriver;
7use quote::ToTokens;
8use syn::{parse_macro_input, DeriveInput};
9
10// Be warned that most of the variable names are nonsensical.
11
12// Internal derive.
13#[proc_macro_derive(
14    PacketReadWrite,
15    attributes(Id, Seek, SeekAfter, Const_u16, Flags, Magic, OnlyOn, NotOn)
16)]
17pub fn packet_read_write_derive(input: TokenStream) -> TokenStream {
18    let input = parse_macro_input!(input as DeriveInput);
19    packet_deriver(&input, true).unwrap_or_else(|err| err.to_compile_error().into())
20}
21
22// Public derive.
23#[proc_macro_derive(
24    PacketRW,
25    attributes(Id, Seek, SeekAfter, Const_u16, Flags, Magic, OnlyOn, NotOn)
26)]
27pub fn pub_packet_read_write_derive(input: TokenStream) -> TokenStream {
28    let input = parse_macro_input!(input as DeriveInput);
29    packet_deriver(&input, false).unwrap_or_else(|err| err.to_compile_error().into())
30}
31
32// Internal derive.
33#[proc_macro_derive(
34    HelperReadWrite,
35    attributes(
36        Seek,
37        SeekAfter,
38        Const_u16,
39        Read_default,
40        Skip,
41        Flags,
42        BitFlags,
43        ManualRW,
44        OnlyOn,
45        NotOn,
46    )
47)]
48pub fn helper_read_write_derive(input: TokenStream) -> TokenStream {
49    let input = parse_macro_input!(input as DeriveInput);
50    helper_deriver(&input, true).unwrap_or_else(|err| output_error(input.to_token_stream(), err))
51}
52
53// External derive.
54#[proc_macro_derive(
55    HelperRW,
56    attributes(
57        Seek,
58        SeekAfter,
59        Const_u16,
60        Read_default,
61        Skip,
62        Flags,
63        BitFlags,
64        ManualRW,
65        OnlyOn,
66        NotOn,
67    )
68)]
69pub fn pub_helper_read_write_derive(input: TokenStream) -> TokenStream {
70    let input = parse_macro_input!(input as DeriveInput);
71    helper_deriver(&input, false).unwrap_or_else(|err| output_error(input.to_token_stream(), err))
72}
73
74// Internal derive.
75#[proc_macro_derive(
76    ProtocolReadWrite,
77    attributes(Id, Empty, Raw, Unknown, NGS, Classic, NA, JP, Vita, Category)
78)]
79pub fn protocol_read_write_derive(input: TokenStream) -> TokenStream {
80    let input = parse_macro_input!(input as DeriveInput);
81    protocol_deriver(&input, true).unwrap_or_else(|err| output_error(input.to_token_stream(), err))
82}
83
84// Public derive.
85#[proc_macro_derive(
86    ProtocolRW,
87    attributes(Id, Empty, Raw, Unknown, NGS, Classic, NA, JP, Vita, Category)
88)]
89pub fn pub_protocol_read_write_derive(input: TokenStream) -> TokenStream {
90    let input = parse_macro_input!(input as DeriveInput);
91    protocol_deriver(&input, false).unwrap_or_else(|err| output_error(input.to_token_stream(), err))
92}
93
94fn output_error(mut input: TS2, err: syn::Error) -> TokenStream {
95    input.extend(err.to_compile_error());
96    input.into()
97}