package shell
import (
)
type ScriptConfig struct {
SpawnDaemon bool
Paths Paths
Cmd bool
CompileOnly bool
JSON bool
}
func ( [3]*os.File, []string, *ScriptConfig) int {
, := setupShell(, .Paths, .SpawnDaemon)
defer ()
:= [0]
.SetArgs([1:])
var , string
if .Cmd {
= "code from -c"
=
} else {
var error
, = filepath.Abs()
if != nil {
fmt.Fprintf([2],
"cannot get full path of script %q: %v\n", , )
return 2
}
, = readFileUTF8()
if != nil {
fmt.Fprintf([2], "cannot read script %q: %v\n", , )
return 2
}
}
:= parse.Source{Name: , Code: , IsFile: true}
if .CompileOnly {
, := .Check(, [2])
if .JSON {
fmt.Fprintf([1], "%s\n", errorsToJSON(, ))
} else {
if != nil {
diag.ShowError([2], )
}
if != nil {
diag.ShowError([2], )
}
}
if != nil || != nil {
return 2
}
} else {
, := evalInTTY(, , )
if != nil {
diag.ShowError([2], )
return 2
}
}
return 0
}
var errSourceNotUTF8 = errors.New("source is not UTF-8")
func ( string) (string, error) {
, := ioutil.ReadFile()
if != nil {
return "",
}
if !utf8.Valid() {
return "", errSourceNotUTF8
}
return string(), nil
}
type errorInJSON struct {
FileName string `json:"fileName"`
Start int `json:"start"`
End int `json:"end"`
Message string `json:"message"`
}
func ( *parse.Error, *diag.Error) []byte {
var []errorInJSON
if != nil {
for , := range .Entries {
= append(,
errorInJSON{.Context.Name, .Context.From, .Context.To, .Message})
}
}
if != nil {
= append(,
errorInJSON{.Context.Name,
.Context.From, .Context.To, .Message})
}
, := json.Marshal()
if != nil {
return []byte(`[{"message":"Unable to convert the errors to JSON"}]`)
}
return
}