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 }