Add executable

This commit is contained in:
Savely Krendelhoff 2025-09-06 16:47:03 +07:00
parent 4c67f5844b
commit c37e2a312a
No known key found for this signature in database
GPG key ID: F70DFD34F40238DE

70
cmd/converter/main.go Normal file
View file

@ -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 <amount> <from_currency> <to_currency>\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)
}