main
API
main
packageAPI reference for the main
package.
Imports
(15)
STD
context
STD
fmt
STD
log/slog
INT
github.com/mirkobrombin/go-module-router/v2/pkg/core
INT
github.com/mirkobrombin/go-module-router/v2/pkg/logger
INT
github.com/mirkobrombin/go-module-router/v2/pkg/transport/action
STD
flag
STD
os
INT
github.com/mirkobrombin/go-module-router/v2/examples/basic/core/modules/ping
INT
github.com/mirkobrombin/go-module-router/v2/pkg/router
INT
github.com/mirkobrombin/go-module-router/v2/pkg/swagger
STD
time
PKG
github.com/mirkobrombin/go-revert/v2/pkg/engine
PKG
github.com/mirkobrombin/go-revert/v2/pkg/step
PKG
github.com/mirkobrombin/go-signal/v2/pkg/bus
S
struct
Document
examples/action/main.go:15-19
type Document struct
Methods
Fields
| Name | Type | Description |
|---|---|---|
| Name | string | |
| Content | string | |
| Dirty | bool |
S
struct
SaveAction
examples/action/main.go:28-31
type SaveAction struct
Methods
Handle
Method
Parameters
ctx
context.Context
Returns
any
error
func (*SaveAction) Handle(ctx context.Context) (any, error)
{
if err := a.Document.Save(); err != nil {
return nil, err
}
return map[string]string{"status": "saved", "file": a.Document.Name}, nil
}
Fields
| Name | Type | Description |
|---|---|---|
| Meta | core.Pattern | action:"file.save" keys:"ctrl+s" |
| Document | *Document |
S
struct
NewFileAction
examples/action/main.go:40-43
type NewFileAction struct
Methods
Handle
Method
Parameters
ctx
context.Context
Returns
any
error
func (*NewFileAction) Handle(ctx context.Context) (any, error)
{
a.Document.Name = "Untitled"
a.Document.Content = ""
a.Document.Dirty = false
return map[string]string{"status": "new file created"}, nil
}
Fields
| Name | Type | Description |
|---|---|---|
| Meta | core.Pattern | action:"file.new" keys:"ctrl+n" |
| Document | *Document |
F
function
main
examples/action/main.go:54-90
func main()
{
// Create document
doc := &Document{Name: "test.txt", Content: "Hello World", Dirty: true}
// Create action transport
t := action.New()
t.Logger = logger.NewSlog(slog.Default())
// Register dependencies
t.Provide("Document", doc)
// Register actions
t.Register(&SaveAction{})
t.Register(&NewFileAction{})
// Show registered actions
fmt.Println("Registered actions:", t.Actions())
fmt.Println("Key bindings:", t.KeyBindings())
// Simulate user pressing Ctrl+S
fmt.Println("\n--- Dispatching 'ctrl+s' ---")
result, err := t.DispatchKey(context.Background(), "ctrl+s")
if err != nil {
slog.Error("dispatch failed", "error", err)
} else {
fmt.Printf("Result: %v\n", result)
}
// Simulate dispatching by action name
fmt.Println("\n--- Dispatching 'file.new' ---")
result, err = t.Dispatch(context.Background(), "file.new")
if err != nil {
slog.Error("dispatch failed", "error", err)
} else {
fmt.Printf("Result: %v\n", result)
}
}
F
function
main
examples/basic/main.go:15-49
func main()
{
metaFlag := flag.Bool("meta", false, "generate OpenAPI JSON and exit")
flag.Parse()
// Create endpoint prototype (for registration and swagger)
pingEndpoint := &ping.PingEndpoint{}
// Handle 'swagger' subcommand OR --meta flag
if (len(os.Args) > 1 && os.Args[1] == "swagger") || *metaFlag {
doc, err := swagger.Build("Example API", "1.0.0", pingEndpoint)
if err != nil {
fmt.Fprintf(os.Stderr, "swagger build error: %v\n", err)
os.Exit(1)
}
fmt.Println(string(doc))
os.Exit(0)
}
// Create router
r := router.New()
r.SetLogger(logger.NewSlog(slog.Default()))
// Register dependencies (by field name)
r.Provide("PingService", ping.NewPingService())
// Register endpoints (explicit, no init() magic)
r.Register(pingEndpoint)
slog.Info("🚀 Server listening on :8080")
slog.Info("Try: curl http://localhost:8080/api/v1/ping?times=3")
if err := r.Listen(":8080"); err != nil {
slog.Error("server terminated", "err", err)
}
}
S
struct
OrderProcessed
Events
examples/integration/main.go:15-18
type OrderProcessed struct
Fields
| Name | Type | Description |
|---|---|---|
| OrderID | string | |
| Status | string |
S
struct
CheckoutAction
Action Handler
examples/integration/main.go:21-24
type CheckoutAction struct
Methods
Handle
Method
Parameters
ctx
context.Context
Returns
any
error
func (*CheckoutAction) Handle(ctx context.Context) (any, error)
{
fmt.Printf("[Action] Starting checkout for order: %s\n", a.OrderID)
// Create a reversible workflow
wf := engine.New()
wf.Add(&step.Basic{
Name: "Reserve Items",
OnExecute: func(ctx context.Context) error {
fmt.Println(" [Workflow] Items reserved.")
return nil
},
OnUndo: func(ctx context.Context) error {
fmt.Println(" [Workflow] Items released.")
return nil
},
})
wf.Add(&step.Basic{
Name: "Process Payment",
OnExecute: func(ctx context.Context) error {
fmt.Println(" [Workflow] Payment processed.")
return nil
},
OnUndo: func(ctx context.Context) error {
fmt.Println(" [Workflow] Payment refunded.")
return nil
},
})
if err := wf.Run(ctx); err != nil {
return nil, err
}
return map[string]string{"status": "completed", "order_id": a.OrderID}, nil
}
Fields
| Name | Type | Description |
|---|---|---|
| Meta | router.Meta | action:"order.checkout" keys:"ctrl+b" |
| OrderID | string | json:"order_id" |
F
function
main
examples/integration/main.go:62-90
func main()
{
r := router.New()
// Subscribe to OrderProcessed events using the Default Bus (passing nil as bus)
// The Action transport automatically emits events on this bus by default.
bus.Subscribe(nil, func(ctx context.Context, e *CheckoutAction) error {
fmt.Printf("[Signal] Async notification: Order %s was processed successfully!\n", e.OrderID)
return nil
})
// Register Action
r.RegisterAction(&CheckoutAction{})
fmt.Println("--- Dispatching Checkout Action ---")
// Passing payload as a map
res, err := r.Dispatch(context.Background(), "order.checkout", map[string]any{
"order_id": "ORD-2024-ABC",
})
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Response: %v\n", res)
// Wait a bit for async signals
time.Sleep(500 * time.Millisecond)
fmt.Println("Done.")
}