github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/utils/io/write.go (about)

     1  package io
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"fmt"
     7  	"os"
     8  	"path/filepath"
     9  	"syscall"
    10  )
    11  
    12  // WriteFile writes a byte array to the file at the given path.
    13  // This method will also create the directory and file as needed.
    14  func WriteFile(path string, data []byte) error {
    15  	err := os.MkdirAll(filepath.Dir(path), 0755)
    16  	if err != nil {
    17  		return fmt.Errorf("could not create output dir: %w", err)
    18  	}
    19  
    20  	err = os.WriteFile(path, data, 0644)
    21  	if err != nil {
    22  		return fmt.Errorf("could not write file: %w", err)
    23  	}
    24  
    25  	return nil
    26  }
    27  
    28  // WriteText writes a byte array to the file at the given path.
    29  func WriteText(path string, data []byte) error {
    30  	err := os.WriteFile(path, data, 0644)
    31  	if err != nil {
    32  		return fmt.Errorf("could not write file: %w", err)
    33  	}
    34  
    35  	return nil
    36  }
    37  
    38  // WriteJSON marshals the given interface into JSON and writes it to the given path
    39  func WriteJSON(path string, data interface{}) error {
    40  	bz, err := json.MarshalIndent(data, "", "  ")
    41  	if err != nil {
    42  		return fmt.Errorf("could not marshal json: %w", err)
    43  	}
    44  
    45  	return WriteFile(path, bz)
    46  }
    47  
    48  // TerminateOnFullDisk panics if the input error is (or wraps) the system "out of disk
    49  // space" error. It's a no-op for any other error, or nil.
    50  func TerminateOnFullDisk(err error) error {
    51  	if err != nil && errors.Is(err, syscall.ENOSPC) {
    52  		panic(fmt.Sprintf("disk full, terminating node: %s", err.Error()))
    53  	}
    54  	return err
    55  }