element-template/main.go
Snider ad5418f3b1 refactor(api): update import path from go-api to core/api
Part of the polyglot merge — forge.lthn.ai/core/go-api is now
forge.lthn.ai/core/api.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-14 10:10:53 +00:00

72 lines
1.4 KiB
Go

// SPDX-License-Identifier: EUPL-1.2
// core-element-template demonstrates the service provider pattern.
// It serves a Lit custom element backed by a Go API using core/go-api.
//
// Usage:
//
// go run . [--port 8080]
package main
import (
"context"
"embed"
"flag"
"io/fs"
"os"
"os/signal"
"syscall"
api "forge.lthn.ai/core/api"
"forge.lthn.ai/core/go-log"
"github.com/gin-gonic/gin"
)
//go:embed all:ui/dist
var uiAssets embed.FS
func main() {
port := flag.String("port", "8080", "HTTP server port")
flag.Parse()
logger := log.New("element-template")
// Create API engine with middleware
engine, err := api.New(
api.WithCORS(),
)
if err != nil {
logger.Error("failed to create API engine", "error", err)
os.Exit(1)
}
// Register the demo provider
engine.Register(&DemoProvider{})
// Serve the Lit custom element UI as static files
staticFS, err := fs.Sub(uiAssets, "ui/dist")
if err != nil {
logger.Error("failed to load UI assets", "error", err)
os.Exit(1)
}
engine.Router().NoRoute(gin.WrapH(
noCache(staticFS),
))
// Start server
ctx, cancel := signal.NotifyContext(context.Background(),
syscall.SIGINT, syscall.SIGTERM)
defer cancel()
addr := ":" + *port
logger.Info("starting server", "addr", addr)
go func() {
if err := engine.Serve(ctx, addr); err != nil {
logger.Error("server error", "error", err)
}
}()
<-ctx.Done()
logger.Info("shutting down")
}