diff --git a/main.go b/main.go index 289e8a1..bcfe800 100644 --- a/main.go +++ b/main.go @@ -10,6 +10,7 @@ import ( "math/big" "math/rand" "os" + "path/filepath" "strconv" "time" @@ -203,9 +204,13 @@ func main() { } func writeToFile(filename string, data []stats) error { + if err := os.MkdirAll(filepath.Dir(filename), 0755); err != nil { + return fmt.Errorf("failed to create output directory: %w", err) + } + file, err := os.Create(filename) if err != nil { - log.Fatalf("Failed to create file: %v", err) + return fmt.Errorf("failed to create file: %w", err) } defer file.Close() @@ -214,7 +219,7 @@ func writeToFile(filename string, data []stats) error { header := []string{"sent_at", "txn_hash", "included_in_block", "inclusion_delay_ms"} if err := writer.Write(header); err != nil { - log.Fatalf("Failed to write to file: %v", err) + return fmt.Errorf("failed to write header: %w", err) } for _, d := range data { @@ -225,10 +230,14 @@ func writeToFile(filename string, data []stats) error { strconv.FormatInt(d.InclusionDelay.Milliseconds(), 10), } if err := writer.Write(row); err != nil { - log.Fatalf("Failed to write to file: %v", err) + return fmt.Errorf("failed to write row: %w", err) } } + if err := writer.Error(); err != nil { + return fmt.Errorf("failed to flush csv: %w", err) + } + return nil } diff --git a/main_test.go b/main_test.go new file mode 100644 index 0000000..5413657 --- /dev/null +++ b/main_test.go @@ -0,0 +1,28 @@ +package main + +import ( + "os" + "path/filepath" + "testing" + "time" +) + +func TestWriteToFileCreatesParentDirectory(t *testing.T) { + filename := filepath.Join(t.TempDir(), "nested", "flashblocks-us-east.csv") + + err := writeToFile(filename, []stats{ + { + SentAt: time.Unix(1, 0), + TxnHash: "0xabc", + IncludedInBlock: 123, + InclusionDelay: 250 * time.Millisecond, + }, + }) + if err != nil { + t.Fatalf("writeToFile returned error: %v", err) + } + + if _, err := os.Stat(filename); err != nil { + t.Fatalf("expected output file to be created: %v", err) + } +}