Skip to content

Module System

The Module system (pkg/module) provides a declarative way to register UI menus, routes, and API endpoints using the .itw3.json configuration format.

Features

  • Declarative module configuration
  • UI menu contributions
  • Frontend route registration
  • API endpoint declarations
  • Multi-context support (developer, retail, miner)
  • Binary/daemon management
  • Module dependencies

Module Config Format

Modules are defined using .itw3.json files:

{
    "code": "wallet",
    "type": "core",
    "name": "Wallet Manager",
    "version": "1.0.0",
    "namespace": "finance",
    "description": "Cryptocurrency wallet management",
    "author": "Your Name",
    "contexts": ["default", "retail"],
    "menu": [...],
    "routes": [...],
    "api": [...],
    "config": {...}
}

Module Types

Type Description
core Built-in core functionality
app External web application
bin Binary/daemon wrapper

UI Contexts

Modules can target specific UI contexts:

Context Description
default Standard user interface
developer Developer tools and debugging
retail Point-of-sale interface
miner Mining operations interface

Add items to the application menu:

{
    "menu": [
        {
            "id": "wallet-send",
            "label": "Send Funds",
            "icon": "send",
            "route": "/wallet/send",
            "accelerator": "CmdOrCtrl+Shift+S",
            "contexts": ["default", "retail"],
            "order": 10
        },
        {
            "id": "wallet-receive",
            "label": "Receive",
            "icon": "receive",
            "route": "/wallet/receive",
            "order": 20
        },
        {
            "separator": true
        },
        {
            "id": "wallet-settings",
            "label": "Settings",
            "action": "wallet.open_settings",
            "children": [
                {"id": "wallet-backup", "label": "Backup", "action": "wallet.backup"},
                {"id": "wallet-restore", "label": "Restore", "action": "wallet.restore"}
            ]
        }
    ]
}

Route Contributions

Register frontend routes:

{
    "routes": [
        {
            "path": "/wallet",
            "component": "wallet-dashboard",
            "title": "Wallet",
            "icon": "wallet",
            "contexts": ["default"]
        },
        {
            "path": "/wallet/send",
            "component": "wallet-send-form",
            "title": "Send Funds"
        }
    ]
}

API Declarations

Declare API endpoints the module provides:

{
    "api": [
        {
            "method": "GET",
            "path": "/balance",
            "description": "Get wallet balance"
        },
        {
            "method": "POST",
            "path": "/send",
            "description": "Send transaction"
        }
    ]
}

Binary Downloads

For bin type modules, specify platform binaries:

{
    "downloads": {
        "app": "https://example.com/wallet-ui.tar.gz",
        "x86_64": {
            "darwin": {
                "url": "https://example.com/wallet-darwin-x64",
                "checksum": "sha256:abc123..."
            },
            "linux": {
                "url": "https://example.com/wallet-linux-x64",
                "checksum": "sha256:def456..."
            },
            "windows": {
                "url": "https://example.com/wallet-win-x64.exe",
                "checksum": "sha256:ghi789..."
            }
        },
        "aarch64": {
            "darwin": {
                "url": "https://example.com/wallet-darwin-arm64"
            }
        }
    }
}

Web App Configuration

For app type modules:

{
    "app": {
        "url": "https://example.com/wallet-app.tar.gz",
        "type": "spa",
        "hooks": [
            {
                "type": "rename",
                "from": "dist",
                "to": "wallet"
            }
        ]
    }
}

Dependencies

Declare module dependencies:

{
    "depends": ["core", "crypto"]
}

Using in Go

Module Registration

import "github.com/Snider/Core/pkg/module"

// Create from config
cfg := module.Config{
    Code:      "wallet",
    Type:      module.TypeCore,
    Name:      "Wallet",
    Namespace: "finance",
}

mod := module.Module{
    Config:  cfg,
    Handler: myHandler,
}

Gin Router Integration

type WalletModule struct{}

func (m *WalletModule) RegisterRoutes(group *gin.RouterGroup) {
    group.GET("/balance", m.getBalance)
    group.POST("/send", m.sendTransaction)
}

// Register with Gin
router := gin.Default()
apiGroup := router.Group("/api/finance/wallet")
walletModule.RegisterRoutes(apiGroup)

Registry Service

The registry manages all modules:

import "github.com/Snider/Core/pkg/module"

registry := module.NewRegistry()

// Register module
registry.Register(walletModule)

// Get module by code
mod := registry.Get("wallet")

// List all modules
modules := registry.List()

// Get modules for context
devModules := registry.ForContext(module.ContextDeveloper)

Built-in Modules

Core provides several built-in modules:

  • System information
  • Configuration management
  • Process management
  • File operations

Access via:

builtins := module.BuiltinModules()