warfactoryracine/core/include/warfactory/IModule.h
StillHammer c37f7d245e Complete Phase 1: Finalize all core interfaces with immutable architecture
- **IEngine**: Add run(), step(), loadModules(), socket management, health monitoring
- **IModuleSystem**: Inherit ITaskScheduler, 1:1 module relationship, task delegation
- **IModule**: Service injection (IIO*, ITaskScheduler*), pub/sub communication, void process()
- **IIO**: Pull-based pub/sub with wildcards, low-frequency batching, health monitoring
- **ITaskScheduler**: Task delegation interface for module→execution system

Architecture completed with quadruple interface pattern optimized for:
- Thread-safe pull-based messaging
- Module task delegation to execution systems
- Engine health monitoring of all IIO instances
- Immutable interface foundation for future development

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 09:03:56 +08:00

123 lines
4.1 KiB
C++

#pragma once
#include <string>
#include <nlohmann/json.hpp>
// Forward declarations
namespace warfactory {
class IIO;
class ITaskScheduler;
}
using json = nlohmann::json;
namespace warfactory {
/**
* @brief Task scheduling interface for module delegation
*
* Allows modules to delegate tasks to their execution system without
* knowing the underlying implementation (sequential, threaded, thread pool).
*/
class ITaskScheduler {
public:
virtual ~ITaskScheduler() = default;
/**
* @brief Schedule a task for execution
* @param taskType Type of task (e.g., "pathfinding", "collision_check")
* @param taskData JSON data for the task
*/
virtual void scheduleTask(const std::string& taskType, const json& taskData) = 0;
/**
* @brief Check if completed tasks are available
* @return Number of completed tasks ready to be pulled
*/
virtual int hasCompletedTasks() const = 0;
/**
* @brief Pull and consume one completed task
* @return Task result JSON. Task is removed from completed queue.
*/
virtual json getCompletedTask() = 0;
};
/**
* @brief Pure business logic interface - optimized for Claude Code development
*
* This interface defines the contract for all game modules. Each module contains
* 200-300 lines of pure game logic with zero infrastructure code.
*
* Key design principles:
* - PURE FUNCTION: process() method has no side effects beyond return value
* - JSON ONLY: All communication via JSON input/output
* - NO INFRASTRUCTURE: No threading, networking, or framework dependencies
* - HOT-RELOAD READY: State serialization for seamless module replacement
* - CLAUDE OPTIMIZED: Micro-context size for AI development efficiency
*
* Module constraint: Maximum 300 lines per module (Exception: ProductionModule 500-800 lines)
*/
class IModule {
public:
virtual ~IModule() = default;
/**
* @brief Process game logic
* @param input JSON input from other modules or the module system
*
* This is the core method where all module logic is implemented.
* Modules communicate via IIO pub/sub and can delegate tasks via ITaskScheduler.
* Must handle state properly through getState/setState for hot-reload.
*/
virtual void process(const json& input) = 0;
/**
* @brief Initialize module with configuration and services
* @param config JSON configuration specific to this module
* @param io Pub/sub communication interface for messaging
* @param scheduler Task scheduling interface for delegating work
*
* Called once when the module is first loaded. Should setup any
* internal state, validate configuration, and store service references.
*/
virtual void initialize(const json& config, IIO* io, ITaskScheduler* scheduler) = 0;
/**
* @brief Cleanup and shutdown the module
*
* Called when the module is being unloaded. Should clean up any
* resources and prepare for safe destruction.
*/
virtual void shutdown() = 0;
/**
* @brief Get current module state for hot-reload support
* @return JSON representation of all module state
*
* Critical for hot-reload functionality. Must serialize all internal
* state that needs to be preserved when the module is replaced.
* The returned JSON should be sufficient to restore the module to
* its current state via setState().
*/
virtual json getState() = 0;
/**
* @brief Restore module state after hot-reload
* @param state JSON state previously returned by getState()
*
* Called after module replacement to restore the previous state.
* Must be able to reconstruct all internal state from the JSON
* to ensure seamless hot-reload without game disruption.
*/
virtual void setState(const json& state) = 0;
/**
* @brief Get module type identifier
* @return Module type as string (e.g., "tank", "economy", "production")
*/
virtual std::string getType() const = 0;
};
} // namespace warfactory