cmd/portr/cmd/check.go

// `portr check` — one-shot run that returns non-zero if any target is closed.
//
// See mercemay.top/src/portr/ for context.
package cmd

import (
	"context"
	"fmt"
	"os"

	"github.com/spf13/cobra"

	"github.com/mercemay/portr/internal/check"
	"github.com/mercemay/portr/internal/config/target"
	"github.com/mercemay/portr/internal/output/table"
)

var checkCmd = &cobra.Command{
	Use:   "check",
	Short: "Run one pass of the connectivity check and print a table",
	RunE: func(cmd *cobra.Command, _ []string) error {
		cfg, err := loadConfig()
		if err != nil {
			return err
		}
		rep, err := check.Run(cmd.Context(), cfg)
		if err != nil {
			return err
		}
		if err := table.New().Write(os.Stdout, rep); err != nil {
			return err
		}
		if _, closed := rep.Summary(); closed > 0 {
			// Communicate unreachable targets to shell pipelines.
			return exitErr(2, fmt.Errorf("%d targets closed", closed))
		}
		return nil
	},
}

// exitErr is a sentinel that cobra prints and propagates to main.
type exitErr struct {
	code int
	err  error
}

func (e *exitErrT) Error() string { return e.err.Error() }

type exitErrT struct {
	code int
	err  error
}

func filterByTag(ts []target.Target, tag string) []target.Target {
	return check.FilterByTag(ts, tag)
}

func exitErrFn(code int, err error) error { return &exitErrT{code: code, err: err} }

// Wrap for ergonomic call-site naming.
func ctxOr(cmd *cobra.Command) context.Context { return cmd.Context() }