From 0237fbdada654a3b71baee1f45464435b62a6636 Mon Sep 17 00:00:00 2001 From: Josh Sandlin Date: Thu, 8 May 2025 22:43:38 -0400 Subject: [PATCH 1/3] remove the influx feature --- cmd/events/list.go | 147 ++++--------------------------- go.mod | 8 -- go.sum | 37 -------- pkg/output/config/config.go | 33 ------- pkg/output/influxdb/influxdb.go | 150 -------------------------------- pkg/output/output.go | 48 +--------- 6 files changed, 22 insertions(+), 401 deletions(-) delete mode 100644 pkg/output/config/config.go delete mode 100644 pkg/output/influxdb/influxdb.go diff --git a/cmd/events/list.go b/cmd/events/list.go index 89a5a4e..d64928f 100644 --- a/cmd/events/list.go +++ b/cmd/events/list.go @@ -5,11 +5,9 @@ import ( "encoding/json" "fmt" "net/http" - "os" "time" "github.com/dydx/vico-cli/pkg/auth" - influxdb2 "github.com/influxdata/influxdb-client-go/v2" "github.com/spf13/cobra" ) @@ -45,11 +43,6 @@ type Event struct { var hours int var outputFormat string -var outputDestination string -var influxURL string -var influxOrg string -var influxBucket string -var influxToken string // listCmd represents the command to list events from the Vicohome API. // It allows users to fetch events from a specified number of hours in the past, @@ -84,136 +77,39 @@ var listCmd = &cobra.Command{ return } - // Display events based on output destination and format + // Display events if len(events) == 0 { fmt.Println("No events found in the specified time period.") return } - if outputDestination == "influxdb" { - // Write to InfluxDB - if err := writeToInfluxDB(events); err != nil { - fmt.Printf("Error writing to InfluxDB: %v\n", err) + // Write to stdout + if outputFormat == "json" { + // Output JSON format + prettyJSON, err := json.MarshalIndent(events, "", " ") + if err != nil { + fmt.Printf("Error formatting JSON: %v\n", err) return } + fmt.Println(string(prettyJSON)) } else { - // Write to stdout - if outputFormat == "json" { - // Output JSON format - prettyJSON, err := json.MarshalIndent(events, "", " ") - if err != nil { - fmt.Printf("Error formatting JSON: %v\n", err) - return - } - fmt.Println(string(prettyJSON)) - } else { - // Output table format + // Output table format + fmt.Printf("%-36s %-20s %-25s %-25s %-25s\n", + "Trace ID", "Timestamp", "Device Name", "Bird Name", "Bird Latin") + fmt.Println("--------------------------------------------------------------------------------------------------") + for _, event := range events { fmt.Printf("%-36s %-20s %-25s %-25s %-25s\n", - "Trace ID", "Timestamp", "Device Name", "Bird Name", "Bird Latin") - fmt.Println("--------------------------------------------------------------------------------------------------") - for _, event := range events { - fmt.Printf("%-36s %-20s %-25s %-25s %-25s\n", - event.TraceID, - event.Timestamp, - event.DeviceName, - event.BirdName, - event.BirdLatin) - } + event.TraceID, + event.Timestamp, + event.DeviceName, + event.BirdName, + event.BirdLatin) } } }, } -// writeToInfluxDB writes events to InfluxDB -func writeToInfluxDB(events []Event) error { - // Validate required configuration - if influxURL == "" { - return fmt.Errorf("InfluxDB URL is required") - } - if influxOrg == "" { - return fmt.Errorf("InfluxDB organization is required") - } - if influxBucket == "" { - return fmt.Errorf("InfluxDB bucket is required") - } - if influxToken == "" { - return fmt.Errorf("InfluxDB token is required") - } - - fmt.Printf("Writing %d events to InfluxDB...\n", len(events)) - - // Create client - client := influxdb2.NewClient(influxURL, influxToken) - defer client.Close() - - // Get write API - writeAPI := client.WriteAPI(influxOrg, influxBucket) - - // Create error channel to capture async errors - errorsCh := writeAPI.Errors() - - // Create a channel to signal completion of error handling - done := make(chan bool) - - // Track if we've encountered any errors - var writeError error - - // Start a goroutine to handle errors - go func() { - for err := range errorsCh { - if writeError == nil { - writeError = err - } else { - writeError = fmt.Errorf("%w; additional error: %v", writeError, err) - } - } - done <- true - }() - - // Write all points - for _, event := range events { - // Parse timestamp - timestamp, err := parseTimestamp(event.Timestamp) - if err != nil { - fmt.Printf("Warning: Invalid timestamp '%s' for event with TraceID '%s': %v\n", - event.Timestamp, event.TraceID, err) - continue - } - - // Create a point with measurement "bird_sighting" - point := influxdb2.NewPoint( - "bird_sighting", - map[string]string{ - "device": event.DeviceName, - "serial": event.SerialNumber, - "bird_name": event.BirdName, - "bird_latin": event.BirdLatin, - "trace_id": event.TraceID, - }, - map[string]interface{}{ - "confidence": event.BirdConfidence, - }, - timestamp, - ) - - // Write the point - writeAPI.WritePoint(point) - } - // Force writing of buffered points - writeAPI.Flush() - - // Wait for any errors to be processed - <-done - - // If no errors occurred, we're done - if writeError == nil { - fmt.Printf("Successfully wrote %d events to InfluxDB\n", len(events)) - return nil - } - - return fmt.Errorf("error writing to InfluxDB: %w", writeError) -} // supportedTimeFormats contains the timestamp formats that the handler can parse var supportedTimeFormats = []string{ @@ -241,13 +137,6 @@ func parseTimestamp(timestamp string) (time.Time, error) { func init() { listCmd.Flags().IntVar(&hours, "hours", 24, "Number of hours to fetch events for") listCmd.Flags().StringVar(&outputFormat, "format", "table", "Output format (table or json)") - - // Add flags for output destination and InfluxDB configuration - listCmd.Flags().StringVar(&outputDestination, "output", "stdout", "Output destination (stdout or influxdb)") - listCmd.Flags().StringVar(&influxURL, "influx-url", os.Getenv("INFLUX_URL"), "InfluxDB server URL") - listCmd.Flags().StringVar(&influxOrg, "influx-org", os.Getenv("INFLUX_ORG"), "InfluxDB organization") - listCmd.Flags().StringVar(&influxBucket, "influx-bucket", os.Getenv("INFLUX_BUCKET"), "InfluxDB bucket name") - listCmd.Flags().StringVar(&influxToken, "influx-token", os.Getenv("INFLUX_TOKEN"), "InfluxDB authentication token") } // fetchEvents retrieves events from the Vicohome API within the specified time range. diff --git a/go.mod b/go.mod index 8b0515c..444398c 100644 --- a/go.mod +++ b/go.mod @@ -5,14 +5,6 @@ go 1.23.6 require github.com/spf13/cobra v1.8.0 require ( - github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect - github.com/google/uuid v1.3.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/influxdata/influxdb-client-go/v2 v2.14.0 // indirect - github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect - github.com/oapi-codegen/runtime v1.0.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/lint v0.0.0-20241112194109-818c5a804067 // indirect - golang.org/x/net v0.39.0 // indirect - golang.org/x/tools v0.32.0 // indirect ) diff --git a/go.sum b/go.sum index 515dad0..d0e8c2c 100644 --- a/go.sum +++ b/go.sum @@ -1,47 +1,10 @@ -github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= -github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= -github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= -github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb-client-go/v2 v2.14.0 h1:AjbBfJuq+QoaXNcrova8smSjwJdUHnwvfjMF71M1iI4= -github.com/influxdata/influxdb-client-go/v2 v2.14.0/go.mod h1:Ahpm3QXKMJslpXl3IftVLVezreAUtBOTZssDrjZEFHI= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= -github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= -github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/lint v0.0.0-20241112194109-818c5a804067 h1:adDmSQyFTCiv19j015EGKJBoaa7ElV0Q1Wovb/4G7NA= -golang.org/x/lint v0.0.0-20241112194109-818c5a804067/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= -golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/output/config/config.go b/pkg/output/config/config.go deleted file mode 100644 index d1b4e89..0000000 --- a/pkg/output/config/config.go +++ /dev/null @@ -1,33 +0,0 @@ -// Package config provides configuration structures for output handlers. -package config - -import ( - "os" -) - -// Config holds configuration for output handlers. -type Config struct { - InfluxURL string - InfluxOrg string - InfluxBucket string - InfluxToken string -} - -// LoadFromEnv loads configuration from environment variables. -func LoadFromEnv() Config { - return Config{ - InfluxURL: getEnv("INFLUX_URL", ""), - InfluxOrg: getEnv("INFLUX_ORG", ""), - InfluxBucket: getEnv("INFLUX_BUCKET", ""), - InfluxToken: getEnv("INFLUX_TOKEN", ""), - } -} - -// getEnv gets an environment variable or returns a default value. -func getEnv(key, defaultValue string) string { - value := os.Getenv(key) - if value == "" { - return defaultValue - } - return value -} diff --git a/pkg/output/influxdb/influxdb.go b/pkg/output/influxdb/influxdb.go deleted file mode 100644 index 84e9839..0000000 --- a/pkg/output/influxdb/influxdb.go +++ /dev/null @@ -1,150 +0,0 @@ -// Package influxdb provides functionality for writing events to InfluxDB. -package influxdb - -import ( - "fmt" - "time" - - "github.com/dydx/vico-cli/pkg/models" - influxdb2 "github.com/influxdata/influxdb-client-go/v2" - "github.com/influxdata/influxdb-client-go/v2/api" -) - -// Handler implements the output.Handler interface for InfluxDB. -type Handler struct { - client influxdb2.Client - writeAPI api.WriteAPI - org string - bucket string - maxRetries int - retryDelay time.Duration -} - -// Config holds the configuration for the InfluxDB handler. -type Config struct { - URL string - Org string - Bucket string - Token string - MaxRetries int - RetryDelay time.Duration -} - -// NewHandler creates a new InfluxDB handler. -func NewHandler(url, org, bucket, token string) (*Handler, error) { - // Create client - client := influxdb2.NewClient(url, token) - writeAPI := client.WriteAPI(org, bucket) - - return &Handler{ - client: client, - writeAPI: writeAPI, - org: org, - bucket: bucket, - maxRetries: 3, // Default to 3 retries - retryDelay: 500 * time.Millisecond, // Default to 500ms delay - }, nil -} - -// Write writes events to InfluxDB. -func (h *Handler) Write(events []models.Event) error { - if len(events) == 0 { - fmt.Println("No events to write to InfluxDB") - return nil - } - - fmt.Printf("Writing %d events to InfluxDB...\n", len(events)) - - // Create error channel to capture async errors - errorsCh := h.writeAPI.Errors() - - // Create a channel to signal completion of error handling - done := make(chan bool) - - // Track if we've encountered any errors - var writeError error - - // Start a goroutine to handle errors - go func() { - for err := range errorsCh { - if writeError == nil { - writeError = err - } else { - writeError = fmt.Errorf("%w; additional error: %v", writeError, err) - } - } - done <- true - }() - - // Write all points - for _, event := range events { - // Parse timestamp - timestamp, err := parseTimestamp(event.Timestamp) - if err != nil { - fmt.Printf("Warning: Invalid timestamp '%s' for event with TraceID '%s': %v\n", - event.Timestamp, event.TraceID, err) - continue - } - - // Create a point with measurement "bird_sighting" - point := influxdb2.NewPoint( - "bird_sighting", - map[string]string{ - "device": event.DeviceName, - "serial": event.SerialNumber, - "bird_name": event.BirdName, - "bird_latin": event.BirdLatin, - "trace_id": event.TraceID, - }, - map[string]interface{}{ - "confidence": event.BirdConfidence, - }, - timestamp, - ) - - // Write the point - h.writeAPI.WritePoint(point) - } - - // Force writing of buffered points - h.writeAPI.Flush() - - // Wait for any errors to be processed - <-done - - // If no errors occurred, we're done - if writeError == nil { - fmt.Printf("Successfully wrote %d events to InfluxDB\n", len(events)) - return nil - } - - return fmt.Errorf("error writing to InfluxDB: %w", writeError) -} - -// Close closes the InfluxDB client. -func (h *Handler) Close() { - h.client.Close() -} - -// supportedTimeFormats contains the timestamp formats that the handler can parse -var supportedTimeFormats = []string{ - "2006-01-02 15:04:05", // Standard format - time.RFC3339, // ISO 8601 format -} - -// parseTimestamp attempts to parse a timestamp string using supported formats -func parseTimestamp(timestamp string) (time.Time, error) { - var lastErr error - - // Try each supported format - for _, format := range supportedTimeFormats { - t, err := time.Parse(format, timestamp) - if err == nil { - return t, nil - } - lastErr = err - } - - // If we get here, none of the formats worked - return time.Time{}, lastErr -} diff --git a/pkg/output/output.go b/pkg/output/output.go index 81c9be6..d3accd8 100644 --- a/pkg/output/output.go +++ b/pkg/output/output.go @@ -5,14 +5,11 @@ import ( "fmt" "github.com/dydx/vico-cli/pkg/models" - "github.com/dydx/vico-cli/pkg/output/config" - "github.com/dydx/vico-cli/pkg/output/influxdb" "github.com/dydx/vico-cli/pkg/output/stdout" ) // Handler defines the interface for handling event output. -// Implementations of this interface can output events to different destinations -// (e.g., stdout, InfluxDB) in different formats (e.g., table, JSON). +// Implementations of this interface can output events in different formats (e.g., table, JSON). type Handler interface { // Write outputs the events using the configured format and destination. Write(events []models.Event) error @@ -21,30 +18,12 @@ type Handler interface { Close() } -// Factory creates a Handler based on the specified destination and format. -func Factory(destination, format string, cfg Config) (Handler, error) { - switch destination { - case "stdout": - return NewStdoutHandler(format), nil - case "influxdb": - // Import the influxdb package and create a handler - handler, err := influxdb.NewHandler(cfg.InfluxURL, cfg.InfluxOrg, cfg.InfluxBucket, cfg.InfluxToken) - if err != nil { - return nil, fmt.Errorf("failed to create InfluxDB handler: %w", err) - } - return handler, nil - default: - return nil, fmt.Errorf("unsupported output destination: %s", destination) - } +// Factory creates a Handler based on the specified format. +func Factory(format string) (Handler, error) { + return NewStdoutHandler(format), nil } -// Config is an alias for config.Config to maintain backward compatibility -type Config = config.Config -// LoadConfigFromEnv loads configuration from environment variables. -func LoadConfigFromEnv() Config { - return config.LoadFromEnv() -} // NewStdoutHandler creates a new stdout output handler. func NewStdoutHandler(format string) Handler { @@ -56,23 +35,4 @@ func NewStdoutHandler(format string) Handler { } } -// NewInfluxDBHandler creates a new InfluxDB output handler. -func NewInfluxDBHandler(cfg Config) (Handler, error) { - // Validate required configuration - if cfg.InfluxURL == "" { - return nil, fmt.Errorf("InfluxDB URL is required") - } - if cfg.InfluxOrg == "" { - return nil, fmt.Errorf("InfluxDB organization is required") - } - if cfg.InfluxBucket == "" { - return nil, fmt.Errorf("InfluxDB bucket is required") - } - if cfg.InfluxToken == "" { - return nil, fmt.Errorf("InfluxDB token is required") - } - // We'll use a function in the main package to create the handler - // to avoid import cycles - return nil, fmt.Errorf("InfluxDB handler creation is handled in the main package") -} From 17f52466f281774e4787e397ef99dd00d7f5fd28 Mon Sep 17 00:00:00 2001 From: Josh Sandlin Date: Thu, 8 May 2025 22:45:00 -0400 Subject: [PATCH 2/3] fmt --- cmd/events/list.go | 2 -- pkg/output/output.go | 4 ---- 2 files changed, 6 deletions(-) diff --git a/cmd/events/list.go b/cmd/events/list.go index d64928f..39db2bd 100644 --- a/cmd/events/list.go +++ b/cmd/events/list.go @@ -109,8 +109,6 @@ var listCmd = &cobra.Command{ }, } - - // supportedTimeFormats contains the timestamp formats that the handler can parse var supportedTimeFormats = []string{ "2006-01-02 15:04:05", // Standard format diff --git a/pkg/output/output.go b/pkg/output/output.go index d3accd8..5ecb332 100644 --- a/pkg/output/output.go +++ b/pkg/output/output.go @@ -23,8 +23,6 @@ func Factory(format string) (Handler, error) { return NewStdoutHandler(format), nil } - - // NewStdoutHandler creates a new stdout output handler. func NewStdoutHandler(format string) Handler { switch format { @@ -34,5 +32,3 @@ func NewStdoutHandler(format string) Handler { return stdout.NewTableHandler() } } - - From ad7b6a5716a69652d5787f4900bf9a22ade4b1fb Mon Sep 17 00:00:00 2001 From: Josh Sandlin Date: Fri, 9 May 2025 20:37:15 -0400 Subject: [PATCH 3/3] remove unused package --- pkg/output/output.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/output/output.go b/pkg/output/output.go index 5ecb332..27bf42f 100644 --- a/pkg/output/output.go +++ b/pkg/output/output.go @@ -2,8 +2,6 @@ package output import ( - "fmt" - "github.com/dydx/vico-cli/pkg/models" "github.com/dydx/vico-cli/pkg/output/stdout" )