diff --git a/go.mod b/go.mod index 0b51228..98b77e2 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,11 @@ require ( github.com/wadey/go-rounding v1.1.0 ) +require ( + github.com/gabriel-vasile/mimetype v1.4.2 // indirect + golang.org/x/net v0.8.0 // indirect +) + require ( github.com/jwalton/go-supportscolor v1.1.0 github.com/mattn/go-colorable v0.1.13 // indirect diff --git a/go.sum b/go.sum index 90925f9..feabdf9 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/jwalton/go-supportscolor v1.1.0 h1:HsXFJdMPjRUAx8cIW6g30hVSFYaxh9yRQwEWgkAR7lQ= github.com/jwalton/go-supportscolor v1.1.0/go.mod h1:hFVUAZV2cWg+WFFC4v8pT2X/S2qUUBYMioBD9AINXGs= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= diff --git a/src/file.go b/src/file.go index ff58052..6e455bc 100644 --- a/src/file.go +++ b/src/file.go @@ -5,6 +5,8 @@ import ( "fmt" "io" "os" + + "github.com/gabriel-vasile/mimetype" ) var ArFile = Map(anymap{ @@ -21,6 +23,15 @@ func readtext(file *os.File) (string, error) { return buf.String(), nil } +func readbinary(file *os.File) ([]byte, error) { + var buf bytes.Buffer + _, err := io.Copy(&buf, file) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + func ArRead(args ...any) (any, ArErr) { if len(args) != 1 { return ArObject{}, ArErr{TYPE: "Runtime Error", message: "read takes 1 argument, got " + fmt.Sprint(len(args)), EXISTS: true} @@ -49,6 +60,24 @@ func ArRead(args ...any) (any, ArErr) { } return jsonparse(text), ArErr{} }}, + "contentType": builtinFunc{"contentType", func(...any) (any, ArErr) { + mimetype, err := mimetype.DetectFile(filename) + if err != nil { + return ArObject{}, ArErr{TYPE: "Runtime Error", message: err.Error(), EXISTS: true} + } + return mimetype.String(), ArErr{} + }}, + "bytes": builtinFunc{"bytes", func(...any) (any, ArErr) { + bytes, err := readbinary(file) + if err != nil { + return ArObject{}, ArErr{TYPE: "Runtime Error", message: err.Error(), EXISTS: true} + } + ArBinary := []any{} + for _, b := range bytes { + ArBinary = append(ArBinary, newNumber().SetInt64(int64(b))) + } + return ArBinary, ArErr{} + }}, }), ArErr{} } diff --git a/src/socket.go b/src/socket.go index 3eedb52..cfbe6c8 100644 --- a/src/socket.go +++ b/src/socket.go @@ -108,6 +108,7 @@ func ArSocket(args ...any) (any, ArErr) { "close", func(args ...any) (any, ArErr) { conn.Close() + conn = nil return nil, ArErr{} }, }, @@ -124,6 +125,7 @@ func ArSocket(args ...any) (any, ArErr) { "close", func(args ...any) (any, ArErr) { ln.Close() + ln = nil return nil, ArErr{} }, },