2.7 KiB
2.7 KiB
Story 3.3: Module Loader and Initialization
Metadata
- Story ID: 3.3
- Title: Module Loader and Initialization
- Epic: 3 - Module Framework
- Status: Pending
- Priority: High
- Estimated Time: 6-8 hours
- Dependencies: 3.1, 1.2
Goal
Implement module loading (static and dynamic) with dependency resolution and automatic initialization.
Description
This story implements the complete module loading system that discovers modules, resolves dependencies, initializes them in the correct order, and runs their migrations. It supports both static registration (preferred) and dynamic plugin loading.
Deliverables
1. Module Loader (internal/pluginloader/loader.go)
- Support static registration (preferred method)
- Optional: Go plugin loading (
.sofiles) - Module discovery from
modules/*/module.yaml - Loader interface for extensibility
2. Static Loader (internal/pluginloader/static_loader.go)
- Import modules via side-effect imports
- Collect all registered modules
- Module discovery and registration
3. Optional Plugin Loader (internal/pluginloader/plugin_loader.go)
- Scan
./plugins/*.sofiles - Load via
plugin.Open() - Extract and validate module symbols
- Version compatibility checking
4. Module Initializer (internal/module/initializer.go)
- Collect all registered modules
- Resolve dependency order (topological sort)
- Initialize each module's
Init()fx.Option - Merge all options into main fx container
- Run migrations in dependency order
- Handle errors gracefully
5. FX Lifecycle Integration
- Call
OnStart()during app startup - Call
OnStop()during graceful shutdown - Proper error handling
Implementation Steps
-
Create Module Loader
- Create
internal/pluginloader/loader.go - Define loader interface
- Create
-
Implement Static Loader
- Create
internal/pluginloader/static_loader.go - Implement static module loading
- Create
-
Implement Module Initializer
- Create
internal/module/initializer.go - Implement dependency resolution
- Implement initialization
- Create
-
Integrate with FX
- Add lifecycle hooks
- Test initialization
Acceptance Criteria
- Modules load in correct dependency order
- Module migrations run automatically
- Module initialization integrates with FX
- Lifecycle hooks work correctly
- Dependency resolution handles cycles
- Errors are handled gracefully
Files to Create/Modify
internal/pluginloader/loader.go- Loader interfaceinternal/pluginloader/static_loader.go- Static loaderinternal/pluginloader/plugin_loader.go- Plugin loader (optional)internal/module/initializer.go- Module initializerinternal/di/container.go- Integrate module initialization