2025-02-05 16:06:04 +01:00

52 lines
1.2 KiB
Nim

import std/os
import pkg/chronicles
import pkg/chronos
import pkg/questionable
import pkg/questionable/results
import ./config
import ./logging
import ./metrics
import ./main
type
ApplicationStatus* {.pure.} = enum
Stopped
Stopping
Running
Application* = ref object
status: ApplicationStatus
proc run*(app: Application) =
let config = parseConfig()
info "Loaded configuration", config
# Configure loglevel
updateLogLevel(config.logLevel)
# Ensure datadir path exists:
if not existsDir(config.dataDir):
createDir(config.dataDir)
setupMetrics(config.metricsAddress, config.metricsPort)
info "Metrics endpoint initialized"
info "Starting application"
app.status = ApplicationStatus.Running
if err =? (waitFor startApplication(config)).errorOption:
app.status = ApplicationStatus.Stopping
error "Failed to start application", err = err.msg
while app.status == ApplicationStatus.Running:
try:
chronos.poll()
except Exception as exc:
error "Unhandled exception", msg = exc.msg
quit QuitFailure
notice "Application closed"
proc stop*(app: Application) =
app.status = ApplicationStatus.Stopping