package cmd import ( "context" "log/slog" "code.icb4dc0.de/buildr/buildr/internal/rpc" "code.icb4dc0.de/buildr/buildr/internal/services" ) var _ ServerCommander = (*ServerApp)(nil) func NewServerApp(initializer LevelInitializer, accessor services.TypeRegistryAccessor) *ServerApp { return &ServerApp{ initializer: initializer, accessor: accessor, } } type ServerApp struct { initializer LevelInitializer accessor services.TypeRegistryAccessor } func (s *ServerApp) ServeAPI(ctx context.Context, cfg *rpc.GrpcConfig) error { if err := s.initializer.InitAt(ctx, InitLevelBasic); err != nil { return err } logger := slog.Default() logger.Info("Starting gRPC server", slog.Group("grpc", slog.String("addr", cfg.Host.Address))) grpcServer := rpc.NewServer(logger, s.accessor) go func() { if err := grpcServer.Start(ctx, cfg.Host.Address); err != nil { slog.Error("Error occurred while serving gRPC API", slog.String("err", err.Error())) } }() <-ctx.Done() grpcServer.Close() return nil }