From c37e2a312aa6ea8c8dd4c370f0cbcb4dd7166f37 Mon Sep 17 00:00:00 2001 From: Savely Krendelhoff Date: Sat, 6 Sep 2025 16:47:03 +0700 Subject: [PATCH] Add executable --- cmd/converter/main.go | 70 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 cmd/converter/main.go diff --git a/cmd/converter/main.go b/cmd/converter/main.go new file mode 100644 index 0000000..1e99759 --- /dev/null +++ b/cmd/converter/main.go @@ -0,0 +1,70 @@ +package main + +import ( + "context" + "converter/app" + "converter/domain" + "converter/infrastructure/coinmarketcap" + "fmt" + "os" + "os/signal" + "syscall" + "time" +) + +const ( + expectedArgs = 4 // program name + 3 arguments + apiKeyEnvVar = "CMC_API_KEY" +) + +func main() { + // Check command line arguments + if len(os.Args) != expectedArgs { + fmt.Fprintf(os.Stderr, "Usage: %s \n", os.Args[0]) + fmt.Fprintf(os.Stderr, "Example: %s 100.50 USD BTC\n", os.Args[0]) + os.Exit(1) + } + + // Parse arguments + amount := os.Args[1] + fromCurrency := os.Args[2] + toCurrency := os.Args[3] + + // Get API key from environment + apiKey := os.Getenv(apiKeyEnvVar) + if apiKey == "" { + fmt.Fprintf(os.Stderr, "Error: %s environment variable is required\n", apiKeyEnvVar) + fmt.Fprintf(os.Stderr, "Please set your CoinMarketCap API key:\n") + fmt.Fprintf(os.Stderr, "export %s=your_api_key_here\n", apiKeyEnvVar) + os.Exit(1) + } + + // Initialize dependencies + client := coinmarketcap.NewClient(apiKey) + converter := domain.NewCurrencyConverter() + useCase := app.NewConvertCurrencyUseCase(client, converter) + + // Create context with timeout and signal handling + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + // Set up graceful shutdown on interrupt signals + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigChan + fmt.Fprintf(os.Stderr, "\nReceived interrupt signal, shutting down...\n") + cancel() + }() + + // Execute conversion + result, err := useCase.Execute(ctx, amount, fromCurrency, toCurrency) + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v\n", err) + os.Exit(1) + } + + // Output result + fmt.Printf("%s %s\n", result.Amount.StringFixed(8), result.Currency.Code) +}