extern crate proc_macro;
use proc_macro::TokenStream;
use quote::{format_ident, quote};
use syn::{parse_macro_input, AttributeArgs, ItemFn, Lit, NestedMeta, ReturnType};
#[proc_macro_attribute]
pub fn ai_func(args: TokenStream, input: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as AttributeArgs);
let input = parse_macro_input!(input as ItemFn);
let kind = if let NestedMeta::Lit(Lit::Str(kind)) = &args[0] {
kind.value()
} else {
String::new()
};
let func_name = input.sig.ident.clone();
let export_func_name = format_ident!(
"EXPORT_FUNC_{}",
input.sig.ident.to_string().to_ascii_uppercase()
);
let func_body = input.block.clone();
let expanded = if kind == "init" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
fn #func_name(#logger_arg, #interface_arg) -> #output {
#func_body
}
#[no_mangle]
pub extern "C" fn handleEvent(
skirmishAIId: spring_ai_rs::libc::c_int,
topic: spring_ai_rs::spring_ai_sys::EventTopic,
data: *const spring_ai_rs::libc::c_void,
) -> spring_ai_rs::libc::c_int {
use spring_ai_rs::slog::Drain;
let logger = spring_ai_rs::slog::Logger::root(
spring_ai_rs::ai_logger::AILogger::new(skirmishAIId)
.with_level(spring_ai_rs::slog::Level::Trace)
.with_file_info(true)
.fuse(),
slog::o!()
);
let f = || -> Result<(), Box<dyn spring_ai_rs::Error>> {
match spring_ai_rs::event::event_topic::EventTopic::from(topic) {
spring_ai_rs::event::event_topic::EventTopic::Init => {
spring_ai_rs::event::other::init_wrapper(
&logger,
skirmishAIId,
data,
#func_name
)?;
}
spring_ai_rs::event::event_topic::EventTopic::Release => {
if let Some(release_func) = spring_ai_rs::ai_macro::RELEASE.last() {
spring_ai_rs::event::other::release_wrapper(
&logger,
skirmishAIId,
data,
release_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::Message => {
if let Some(message_func) = spring_ai_rs::ai_macro::MESSAGE.last() {
spring_ai_rs::event::other::message_wrapper(
&logger,
skirmishAIId,
data,
message_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::CommandFinished => {
if let Some(command_finished_func) = spring_ai_rs::ai_macro::COMMAND_FINISHED.last() {
spring_ai_rs::event::other::command_finished_wrapper(
&logger,
skirmishAIId,
data,
command_finished_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::EnemyCreated => {
if let Some(enemy_created_func) = spring_ai_rs::ai_macro::ENEMY_CREATED.last() {
spring_ai_rs::event::enemy::enemy_created_wrapper(
&logger,
skirmishAIId,
data,
enemy_created_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::EnemyDamaged => {
if let Some(enemy_damaged_func) = spring_ai_rs::ai_macro::ENEMY_DAMAGED.last() {
spring_ai_rs::event::enemy::enemy_damaged_wrapper(
&logger,
skirmishAIId,
data,
enemy_damaged_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::EnemyDestroyed => {
if let Some(enemy_destroyed_func) = spring_ai_rs::ai_macro::ENEMY_DESTROYED.last() {
spring_ai_rs::event::enemy::enemy_destroyed_wrapper(
&logger,
skirmishAIId,
data,
enemy_destroyed_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::EnemyEnterLOS => {
if let Some(enemy_enter_los_func) = spring_ai_rs::ai_macro::ENEMY_ENTER_LOS.last() {
let enemy_enter_los_data =
spring_ai_rs::event::enemy::enemy_enter_los_wrapper(
&logger,
skirmishAIId,
data,
enemy_enter_los_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::EnemyEnterRadar => {
if let Some(enemy_enter_radar_func) = spring_ai_rs::ai_macro::ENEMY_ENTER_RADAR.last() {
spring_ai_rs::event::enemy::enemy_enter_radar_wrapper(
&logger,
skirmishAIId,
data,
enemy_enter_radar_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::EnemyFinished => {
if let Some(enemy_finished_func) = spring_ai_rs::ai_macro::ENEMY_FINISHED.last() {
spring_ai_rs::event::enemy::enemy_finished_wrapper(
&logger,
skirmishAIId,
data,
enemy_finished_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::EnemyLeaveLOS => {
if let Some(enemy_leave_los_func) = spring_ai_rs::ai_macro::ENEMY_LEAVE_LOS.last() {
spring_ai_rs::event::enemy::enemy_leave_los_wrapper(
&logger,
skirmishAIId,
data,
enemy_leave_los_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::EnemyLeaveRadar => {
if let Some(enemy_leave_radar_func) = spring_ai_rs::ai_macro::ENEMY_LEAVE_RADAR.last() {
spring_ai_rs::event::enemy::enemy_leave_radar_wrapper(
&logger,
skirmishAIId,
data,
enemy_leave_radar_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::Load => {
if let Some(load_func) = spring_ai_rs::ai_macro::LOAD.last() {
spring_ai_rs::event::other::load_wrapper(
&logger,
skirmishAIId,
data,
load_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::LuaMessage => {
if let Some(lua_message_func) = spring_ai_rs::ai_macro::LUA_MESSAGE.last() {
spring_ai_rs::event::other::lua_message_wrapper(
&logger,
skirmishAIId,
data,
lua_message_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::Null => {
if let Some(null_func) = spring_ai_rs::ai_macro::NULL.last() {
spring_ai_rs::event::other::null_wrapper(
&logger,
skirmishAIId,
null_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::PlayerCommand => {
if let Some(player_command_func) = spring_ai_rs::ai_macro::PLAYER_COMMAND.last() {
spring_ai_rs::event::other::player_command_wrapper(
&logger,
skirmishAIId,
data,
player_command_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::Save => {
if let Some(save_func) = spring_ai_rs::ai_macro::SAVE.last() {
spring_ai_rs::event::other::save_wrapper(
&logger,
skirmishAIId,
data,
save_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::SeismicPing => {
if let Some(seismic_ping_func) = spring_ai_rs::ai_macro::SEISMIC_PING.last() {
spring_ai_rs::event::other::seismic_ping_wrapper(
&logger,
skirmishAIId,
data,
seismic_ping_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::UnitCaptured => {
if let Some(unit_captured_func) = spring_ai_rs::ai_macro::UNIT_CAPTURED.last() {
spring_ai_rs::event::unit::unit_captured_wrapper(
&logger,
skirmishAIId,
data,
unit_captured_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::UnitCreated => {
if let Some(unit_created_func) = spring_ai_rs::ai_macro::UNIT_CREATED.last() {
spring_ai_rs::event::unit::unit_created_wrapper(
&logger,
skirmishAIId,
data,
unit_created_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::UnitDamaged => {
if let Some(unit_damaged_func) = spring_ai_rs::ai_macro::UNIT_DAMAGED.last() {
spring_ai_rs::event::unit::unit_damaged_wrapper(
&logger,
skirmishAIId,
data,
unit_damaged_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::UnitDestroyed => {
if let Some(unit_destroyed_func) = spring_ai_rs::ai_macro::UNIT_DESTROYED.last() {
spring_ai_rs::event::unit::unit_destroyed_wrapper(
&logger,
skirmishAIId,
data,
unit_destroyed_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::UnitFinished => {
if let Some(unit_finished_func) = spring_ai_rs::ai_macro::UNIT_FINISHED.last() {
spring_ai_rs::event::unit::unit_finished_wrapper(
&logger,
skirmishAIId,
data,
unit_finished_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::UnitGiven => {
if let Some(unit_given_func) = spring_ai_rs::ai_macro::UNIT_GIVEN.last() {
spring_ai_rs::event::unit::unit_given_wrapper(
&logger,
skirmishAIId,
data,
unit_given_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::UnitIdle => {
if let Some(unit_idle_func) = spring_ai_rs::ai_macro::UNIT_IDLE.last() {
spring_ai_rs::event::unit::unit_idle_wrapper(
&logger,
skirmishAIId,
data,
unit_idle_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::UnitMoveFailed => {
if let Some(unit_move_failed_func) = spring_ai_rs::ai_macro::UNIT_MOVE_FAILED.last() {
spring_ai_rs::event::unit::unit_move_failed_wrapper(
&logger,
skirmishAIId,
data,
unit_move_failed_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::Update => {
if let Some(update_func) = spring_ai_rs::ai_macro::UPDATE.last() {
spring_ai_rs::event::other::update_wrapper(
&logger,
skirmishAIId,
data,
update_func
)?;
}
}
spring_ai_rs::event::event_topic::EventTopic::WeaponFired => {
if let Some(weapon_fired_func) = spring_ai_rs::ai_macro::WEAPON_FIRED.last() {
spring_ai_rs::event::other::weapon_fired_wrapper(
&logger,
skirmishAIId,
data,
weapon_fired_func
)?;
}
}
_ => {
}
}
Ok(())
};
let ret = f();
if ret.is_ok() {
0
} else {
spring_ai_rs::slog::error!(logger, "{:?}", ret);
-1
}
}
}
} else if kind == "release" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::RELEASE)]
static #export_func_name: spring_ai_rs::event::other::ReleaseFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg) -> #output {
#func_body
}
}
} else if kind == "message" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let player_arg = input.sig.inputs[2].clone();
let message_arg = input.sig.inputs[3].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::MESSAGE)]
static #export_func_name: spring_ai_rs::event::other::MessageFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #player_arg, #message_arg) -> #output {
#func_body
}
}
} else if kind == "command_finished" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let unit_id_arg = input.sig.inputs[2].clone();
let command_id_arg = input.sig.inputs[3].clone();
let command_topic_arg = input.sig.inputs[4].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::COMMAND_FINISHED)]
static #export_func_name: spring_ai_rs::event::other::CommandFinishedFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #unit_id_arg, #command_id_arg, #command_topic_arg) -> #output {
#func_body
}
}
} else if kind == "enemy_created" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let enemy_id_arg = input.sig.inputs[2].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::ENEMY_CREATED)]
static #export_func_name: spring_ai_rs::event::enemy::EnemyCreatedFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #enemy_id_arg) -> #output {
#func_body
}
}
} else if kind == "enemy_damaged" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let enemy_id_arg = input.sig.inputs[2].clone();
let attacker_id_arg = input.sig.inputs[3].clone();
let direction_arg = input.sig.inputs[4].clone();
let weapon_def_id_arg = input.sig.inputs[5].clone();
let paralyzer_arg = input.sig.inputs[6].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::ENEMY_DAMAGED)]
static #export_func_name: spring_ai_rs::event::enemy::EnemyDamagedFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #enemy_id_arg, #attacker_id_arg, #direction_arg, #weapon_def_id_arg, #paralyzer_arg) -> #output {
#func_body
}
}
} else if kind == "enemy_destroyed" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let enemy_id_arg = input.sig.inputs[2].clone();
let attacker_id_arg = input.sig.inputs[3].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::ENEMY_DESTROYED)]
static #export_func_name: spring_ai_rs::event::enemy::EnemyDestroyedFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #enemy_id_arg, #attacker_id_arg) -> #output {
#func_body
}
}
} else if kind == "enemy_enter_los" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let enemy_id_arg = input.sig.inputs[2].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::ENEMY_ENTER_LOS)]
static #export_func_name: spring_ai_rs::event::enemy::EnemyEnterLOSFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #enemy_id_arg) -> #output {
#func_body
}
}
} else if kind == "enemy_enter_radar" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let enemy_id_arg = input.sig.inputs[2].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::ENEMY_ENTER_RADAR)]
static #export_func_name: spring_ai_rs::event::enemy::EnemyEnterRadarFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #enemy_id_arg) -> #output {
#func_body
}
}
} else if kind == "enemy_finished" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let enemy_id_arg = input.sig.inputs[2].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::ENEMY_FINISHED)]
static #export_func_name: spring_ai_rs::event::enemy::EnemyFinishedFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #enemy_id_arg) -> #output {
#func_body
}
}
} else if kind == "enemy_leave_los" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let enemy_id_arg = input.sig.inputs[2].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::ENEMY_LEAVE_LOS)]
static #export_func_name: spring_ai_rs::event::enemy::EnemyLeaveLOSFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #enemy_id_arg) -> #output {
#func_body
}
}
} else if kind == "enemy_leave_radar" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let enemy_id_arg = input.sig.inputs[2].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::ENEMY_LEAVE_RADAR)]
static #export_func_name: spring_ai_rs::event::enemy::EnemyLeaveRadarFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #enemy_id_arg) -> #output {
#func_body
}
}
} else if kind == "load" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let enemy_id_arg = input.sig.inputs[2].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::LOAD)]
static #export_func_name: spring_ai_rs::event::other::LoadFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #enemy_id_arg) -> #output {
#func_body
}
}
} else if kind == "lua_message" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let message_arg = input.sig.inputs[2].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::LUA_MESSAGE)]
static #export_func_name: spring_ai_rs::event::other::LuaMessageFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #message_arg) -> #output {
#func_body
}
}
} else if kind == "null" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::NULL)]
static #export_func_name: spring_ai_rs::event::other::NullFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg) -> #output {
#func_body
}
}
} else if kind == "player_command" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let unit_ids_arg = input.sig.inputs[2].clone();
let command_topic_id_arg = input.sig.inputs[3].clone();
let player_id_arg = input.sig.inputs[4].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::PLAYER_COMMAND)]
static #export_func_name: spring_ai_rs::event::other::PlayerCommandFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #unit_ids_arg, #command_topic_id_arg, #player_id_arg) -> #output {
#func_body
}
}
} else if kind == "save" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let file_id_arg = input.sig.inputs[2].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::SAVE)]
static #export_func_name: spring_ai_rs::event::other::SaveFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #file_id_arg) -> #output {
#func_body
}
}
} else if kind == "seismic_ping" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let position_arg = input.sig.inputs[2].clone();
let strength_arg = input.sig.inputs[3].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::SEISMIC_PING)]
static #export_func_name: spring_ai_rs::event::other::SeismicPingFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #position_arg, #strength_arg) -> #output {
#func_body
}
}
} else if kind == "unit_captured" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let unit_id_arg = input.sig.inputs[2].clone();
let old_team_id_arg = input.sig.inputs[3].clone();
let new_team_id_arg = input.sig.inputs[4].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::UNIT_CAPTURED)]
static #export_func_name: spring_ai_rs::event::unit::UnitCapturedFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #unit_id_arg, #old_team_id_arg, #new_team_id_arg) -> #output {
#func_body
}
}
} else if kind == "unit_created" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let unit_id_arg = input.sig.inputs[2].clone();
let builder_id_arg = input.sig.inputs[3].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::UNIT_CREATED)]
static #export_func_name: spring_ai_rs::event::unit::UnitCreatedFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #unit_id_arg, #builder_id_arg) -> #output {
#func_body
}
}
} else if kind == "unit_damaged" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let unit_id_arg = input.sig.inputs[2].clone();
let attacker_id_arg = input.sig.inputs[3].clone();
let damage_arg = input.sig.inputs[4].clone();
let direction_arg = input.sig.inputs[5].clone();
let weapon_def_id_arg = input.sig.inputs[6].clone();
let paralyzer_arg = input.sig.inputs[7].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::UNIT_DAMAGED)]
static #export_func_name: spring_ai_rs::event::unit::UnitDamagedFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #unit_id_arg, #attacker_id_arg, #damage_arg, #direction_arg, #weapon_def_id_arg, #paralyzer_arg) -> #output {
#func_body
}
}
} else if kind == "unit_destroyed" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let unit_id_arg = input.sig.inputs[2].clone();
let attacker_id_arg = input.sig.inputs[3].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::UNIT_DESTROYED)]
static #export_func_name: spring_ai_rs::event::unit::UnitDestroyedFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #unit_id_arg, #attacker_id_arg) -> #output {
#func_body
}
}
} else if kind == "unit_finished" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let unit_id_arg = input.sig.inputs[2].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::UNIT_FINISHED)]
static #export_func_name: spring_ai_rs::event::unit::UnitFinishedFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #unit_id_arg) -> #output {
#func_body
}
}
} else if kind == "unit_given" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let unit_id_arg = input.sig.inputs[2].clone();
let old_team_id_arg = input.sig.inputs[3].clone();
let new_team_id_arg = input.sig.inputs[4].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::UNIT_GIVEN)]
static #export_func_name: spring_ai_rs::event::unit::UnitGivenFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #unit_id_arg, #old_team_id_arg, #new_team_id_arg) -> #output {
#func_body
}
}
} else if kind == "unit_idle" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let unit_id_arg = input.sig.inputs[2].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::UNIT_IDLE)]
static #export_func_name: spring_ai_rs::event::unit::UnitIdleFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #unit_id_arg) -> #output {
#func_body
}
}
} else if kind == "unit_move_failed" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let unit_id_arg = input.sig.inputs[2].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::UNIT_MOVE_FAILED)]
static #export_func_name: spring_ai_rs::event::unit::UnitMoveFailedFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #unit_id_arg) -> #output {
#func_body
}
}
} else if kind == "update" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let frame_arg = input.sig.inputs[2].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::UPDATE)]
static #export_func_name: spring_ai_rs::event::other::UpdateFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #frame_arg) -> #output {
#func_body
}
}
} else if kind == "weapon_fired" {
let logger_arg = input.sig.inputs[0].clone();
let interface_arg = input.sig.inputs[1].clone();
let unit_id_arg = input.sig.inputs[2].clone();
let weapon_def_id_arg = input.sig.inputs[3].clone();
let output = if let ReturnType::Type(_, func_return_type) = input.sig.output {func_return_type} else {unreachable!()};
quote! {
#[linkme::distributed_slice(spring_ai_rs::ai_macro::WEAPON_FIRED)]
static #export_func_name: spring_ai_rs::event::other::WeaponFiredFuncType = #func_name;
fn #func_name(#logger_arg, #interface_arg, #unit_id_arg, #weapon_def_id_arg) -> #output {
#func_body
}
}
} else {
panic!("Not one of the listed function types");
};
TokenStream::from(expanded)
}