1
0
Fork 0
golang-github-nicholas-fedo.../shoutrrr/cmd/docs/docs.go
Daniel Baumann 6819b9812e
Adding upstream version 0.8.13.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-29 07:17:59 +02:00

89 lines
2.3 KiB
Go

package docs
import (
"fmt"
"log"
"net/url"
"os"
"strings"
"github.com/spf13/cobra"
"github.com/nicholas-fedor/shoutrrr/pkg/format"
"github.com/nicholas-fedor/shoutrrr/pkg/router"
"github.com/nicholas-fedor/shoutrrr/shoutrrr/cmd"
)
var (
serviceRouter router.ServiceRouter
services = serviceRouter.ListServices()
)
var Cmd = &cobra.Command{
Use: "docs",
Short: "Print documentation for services",
Run: Run,
Args: func(cmd *cobra.Command, args []string) error {
serviceList := strings.Join(services, ", ")
cmd.SetUsageTemplate(
cmd.UsageTemplate() + "\nAvailable services: \n " + serviceList + "\n",
)
return cobra.MinimumNArgs(1)(cmd, args)
},
ValidArgs: services,
}
func init() {
Cmd.Flags().StringP("format", "f", "console", "Output format")
}
func Run(cmd *cobra.Command, args []string) {
format, _ := cmd.Flags().GetString("format")
res := printDocs(format, args)
if res.ExitCode != 0 {
fmt.Fprintf(os.Stderr, "%s", res.Message)
}
os.Exit(res.ExitCode)
}
func printDocs(docFormat string, services []string) cmd.Result {
var renderer format.TreeRenderer
switch docFormat {
case "console":
renderer = format.ConsoleTreeRenderer{WithValues: false}
case "markdown":
renderer = format.MarkdownTreeRenderer{
HeaderPrefix: "### ",
PropsDescription: "Props can be either supplied using the params argument, or through the URL using \n`?key=value&key=value` etc.\n",
PropsEmptyMessage: "*The services does not support any query/param props*",
}
default:
return cmd.InvalidUsage("invalid format")
}
logger := log.New(os.Stderr, "", 0) // Concrete logger implementing types.StdLogger
for _, scheme := range services {
service, err := serviceRouter.NewService(scheme)
if err != nil {
return cmd.InvalidUsage("failed to init service: " + err.Error())
}
// Initialize the service to populate Config
dummyURL, _ := url.Parse(scheme + "://dummy@dummy.com")
if err := service.Initialize(dummyURL, logger); err != nil {
return cmd.InvalidUsage(
fmt.Sprintf("failed to initialize service %q: %v\n", scheme, err),
)
}
config := format.GetServiceConfig(service)
configNode := format.GetConfigFormat(config)
fmt.Fprint(os.Stdout, renderer.RenderTree(configNode, scheme), "\n")
}
return cmd.Success
}