1 Commits

Author SHA1 Message Date
2abebfd01b feat: add request timeout 2025-07-24 22:21:11 +02:00
5 changed files with 12 additions and 38 deletions

View File

@ -1,8 +1,11 @@
package cmd package cmd
const DefaultRequestTimeout uint = 30
type AppConfig struct { type AppConfig struct {
OutputVerbose bool OutputVerbose bool
OutputFormatter string OutputFormatter string
OutputOrderReverse bool OutputOrderReverse bool
PrintConfig bool PrintConfig bool
RequestTimeoutSeconds uint
} }

View File

@ -4,12 +4,8 @@ import (
"context" "context"
"fmt" "fmt"
"log/slog" "log/slog"
"maps"
"os" "os"
"slices"
"strings"
"git.bissendorf.co/bissendorf/unifood/m/v2/core/output"
"git.bissendorf.co/bissendorf/unifood/m/v2/core/services/jlog" "git.bissendorf.co/bissendorf/unifood/m/v2/core/services/jlog"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -19,7 +15,6 @@ var rootCmd = &cobra.Command{
Short: "Unifood is a CLI for retrieving restaurant information", Short: "Unifood is a CLI for retrieving restaurant information",
Long: ``, Long: ``,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
_ = cmd.Help()
}, },
} }
@ -35,17 +30,12 @@ func Execute() {
func initRootCmd() { func initRootCmd() {
var appConfig AppConfig var appConfig AppConfig
// Compile list of available formatters
formatters := slices.AppendSeq([]string{}, maps.Keys(output.Formatters))
formattersList := fmt.Sprintf("(available: %s)", strings.Join(formatters, ", "))
// Add persistent flags
rootCmd.PersistentFlags().BoolVarP(&appConfig.OutputVerbose, "verbose", "v", false, "Enable verbose output") rootCmd.PersistentFlags().BoolVarP(&appConfig.OutputVerbose, "verbose", "v", false, "Enable verbose output")
rootCmd.PersistentFlags().StringVarP(&appConfig.OutputFormatter, "output", "o", "table", "Set output format "+formattersList) rootCmd.PersistentFlags().StringVarP(&appConfig.OutputFormatter, "output", "o", "table", "Set output format")
rootCmd.PersistentFlags().BoolVar(&appConfig.OutputOrderReverse, "reverse", false, "Reverses output item order") rootCmd.PersistentFlags().BoolVar(&appConfig.OutputOrderReverse, "reverse", false, "Reverses output item order")
rootCmd.PersistentFlags().BoolVar(&appConfig.PrintConfig, "print-config", false, "Enable printing the application config") rootCmd.PersistentFlags().BoolVar(&appConfig.PrintConfig, "print-config", false, "Enable printing the application config")
rootCmd.PersistentFlags().UintVar(&appConfig.RequestTimeoutSeconds, "timeout", DefaultRequestTimeout, "Set the request timeout in seconds")
// Create logger and add child commands
logger := jlog.New(slog.LevelDebug) logger := jlog.New(slog.LevelDebug)
ctx := jlog.ContextWith(context.Background(), logger) ctx := jlog.ContextWith(context.Background(), logger)

View File

@ -8,6 +8,7 @@ import (
"os" "os"
"slices" "slices"
"strings" "strings"
"time"
"git.bissendorf.co/bissendorf/unifood/m/v2/core/interfaces" "git.bissendorf.co/bissendorf/unifood/m/v2/core/interfaces"
"git.bissendorf.co/bissendorf/unifood/m/v2/core/interfaces/params" "git.bissendorf.co/bissendorf/unifood/m/v2/core/interfaces/params"
@ -92,6 +93,8 @@ func getVerbs(ctx context.Context, config *AppConfig) (commands []*cobra.Command
} }
logger := jlog.New(logLevel) logger := jlog.New(logLevel)
ctx := jlog.ContextWith(context.Background(), logger) ctx := jlog.ContextWith(context.Background(), logger)
ctx, cancel := context.WithTimeout(ctx, time.Duration(config.RequestTimeoutSeconds)*time.Second)
defer cancel()
// Print config // Print config
if config.PrintConfig { if config.PrintConfig {

View File

@ -12,5 +12,4 @@ var Formatters = map[string]interfaces.Formatter{
"csv": &TableFormatter{HideSummary: true, RenderFormat: tableFormatCSV}, "csv": &TableFormatter{HideSummary: true, RenderFormat: tableFormatCSV},
"html": &TableFormatter{HideSummary: true, RenderFormat: tableFormatHTML}, "html": &TableFormatter{HideSummary: true, RenderFormat: tableFormatHTML},
"markdown": &TableFormatter{HideSummary: true, RenderFormat: tableFormatMarkdown}, "markdown": &TableFormatter{HideSummary: true, RenderFormat: tableFormatMarkdown},
"name": &NameFormatter{},
} }

View File

@ -1,21 +0,0 @@
package output
import (
"bytes"
"io"
"git.bissendorf.co/bissendorf/unifood/m/v2/core/interfaces"
)
type NameFormatter struct{}
func (f *NameFormatter) Format(list *interfaces.ResourceList) (io.Reader, error) {
var buffer = make([]byte, 0, 1024)
outputBuffer := bytes.NewBuffer(buffer)
for _, item := range list.Items {
outputBuffer.WriteString(item.ItemName() + "\r\n")
}
return outputBuffer, nil
}