github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/iox/temp.go (about)

     1  package iox
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  )
     7  
     8  // WriteTempFile writes the content to a temporary file.
     9  func WriteTempFile(fns ...WriteTempFileOptionFn) *WriteTempFileResult {
    10  	o := &WriteTempFileOption{}
    11  	for _, fn := range fns {
    12  		fn(o)
    13  	}
    14  	if o.TempDir == "" {
    15  		o.TempDir = os.TempDir()
    16  	}
    17  
    18  	r := o.writeTempFile()
    19  	if r.Err != nil && o.PanicOnError {
    20  		panic(r.Err)
    21  	}
    22  
    23  	return r
    24  }
    25  
    26  type WriteTempFileResult struct {
    27  	Name string
    28  	Err  error
    29  }
    30  
    31  type WriteTempFileOption struct {
    32  	Content      []byte
    33  	TempDir      string
    34  	Pattern      string
    35  	PanicOnError bool
    36  }
    37  
    38  func (o WriteTempFileOption) writeTempFile() *WriteTempFileResult {
    39  	r := &WriteTempFileResult{}
    40  	f, err := ioutil.TempFile(o.TempDir, o.Pattern)
    41  	if err != nil {
    42  		r.Err = err
    43  		return r
    44  	}
    45  
    46  	if _, err := f.Write(o.Content); err != nil {
    47  		r.Err = err
    48  		return r
    49  	}
    50  
    51  	if err := f.Close(); err != nil {
    52  		r.Err = err
    53  		return r
    54  	}
    55  
    56  	r.Name = f.Name()
    57  	return r
    58  }
    59  
    60  type WriteTempFileOptionFn func(*WriteTempFileOption)
    61  
    62  func PanicOnError(c bool) WriteTempFileOptionFn {
    63  	return func(o *WriteTempFileOption) {
    64  		o.PanicOnError = c
    65  	}
    66  }
    67  
    68  func WithTempPattern(c string) WriteTempFileOptionFn {
    69  	return func(o *WriteTempFileOption) {
    70  		o.Pattern = c
    71  	}
    72  }
    73  
    74  func WithTempDir(c string) WriteTempFileOptionFn {
    75  	return func(o *WriteTempFileOption) {
    76  		o.TempDir = c
    77  	}
    78  }
    79  
    80  func WithTempString(c string) WriteTempFileOptionFn {
    81  	return func(o *WriteTempFileOption) {
    82  		o.Content = []byte(c)
    83  	}
    84  }
    85  
    86  func WithTempContent(c []byte) WriteTempFileOptionFn {
    87  	return func(o *WriteTempFileOption) {
    88  		o.Content = c
    89  	}
    90  }