github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/scriptfile/scriptfile.go (about)

     1  package scriptfile
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/ActiveState/cli/internal/fileutils"
     6  	"github.com/ActiveState/cli/internal/language"
     7  	"os"
     8  )
     9  
    10  // ScriptFile represents an on-disk executable file.
    11  type ScriptFile struct {
    12  	lang language.Language
    13  	file string
    14  }
    15  
    16  // New receives a language and script body that are used to construct a runable
    17  // on-disk file that is tracked by the returned value.
    18  func New(l language.Language, name, script string) (*ScriptFile, error) {
    19  	return new(l, name, []byte(l.Header()+script))
    20  }
    21  
    22  // NewEmpty receives a language that is used to construct a runnable, but empty,
    23  // on-disk file that is tracked by the return value.
    24  func NewEmpty(l language.Language, name string) (*ScriptFile, error) {
    25  	return new(l, name, []byte(""))
    26  }
    27  
    28  // NewAsSource recieves a language and script body that are used to construct an
    29  // on-disk file that is tracked by the return value. This file is not guaranteed
    30  // to be runnable
    31  func NewAsSource(l language.Language, name, script string) (*ScriptFile, error) {
    32  	return new(l, name, []byte(script))
    33  }
    34  
    35  func new(l language.Language, name string, script []byte) (*ScriptFile, error) {
    36  	file, err := fileutils.WriteTempFileToDir(
    37  		"", fmt.Sprintf("%s*%s", name, l.Ext()), []byte(script), 0700,
    38  	)
    39  	if err != nil {
    40  		return nil, err
    41  	}
    42  
    43  	return &ScriptFile{
    44  		lang: l,
    45  		file: file,
    46  	}, nil
    47  }
    48  
    49  // Clean provides simple/deferable clean up.
    50  func (sf *ScriptFile) Clean() {
    51  	os.Remove(sf.file)
    52  }
    53  
    54  // Filename returns the on-disk filename of the tracked script file.
    55  func (sf *ScriptFile) Filename() string {
    56  	return sf.file
    57  }
    58  
    59  // Write updates the on-disk scriptfile with the script value
    60  func (sf *ScriptFile) Write(value string) error {
    61  	return fileutils.WriteFile(sf.file, []byte(sf.lang.Header()+value))
    62  }