mirror of
https://github.com/MontFerret/ferret.git
synced 2025-04-15 11:56:42 +02:00
Added possibility to use any type as a file content (#544)
This commit is contained in:
parent
734b737263
commit
d3c28a43ff
@ -20,16 +20,27 @@ import (
|
|||||||
// * w - Write (Default): will create a file if the specified file does not exist
|
// * w - Write (Default): will create a file if the specified file does not exist
|
||||||
func Write(_ context.Context, args ...core.Value) (core.Value, error) {
|
func Write(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||||
err := validateRequiredWriteArgs(args)
|
err := validateRequiredWriteArgs(args)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return values.None, err
|
return values.None, err
|
||||||
}
|
}
|
||||||
|
|
||||||
fpath := args[0].String()
|
fpath := args[0].String()
|
||||||
data := args[1].(values.Binary)
|
arg1 := args[1]
|
||||||
|
|
||||||
|
var data []byte
|
||||||
|
|
||||||
|
if arg1.Type() == types.Binary {
|
||||||
|
data = arg1.(values.Binary)
|
||||||
|
} else {
|
||||||
|
data = []byte(arg1.String())
|
||||||
|
}
|
||||||
|
|
||||||
params := defaultParams
|
params := defaultParams
|
||||||
|
|
||||||
if len(args) == 3 {
|
if len(args) == 3 {
|
||||||
params, err = parseParams(args[2])
|
params, err = parseParams(args[2])
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return values.None, core.Error(
|
return values.None, core.Error(
|
||||||
err,
|
err,
|
||||||
@ -40,12 +51,15 @@ func Write(_ context.Context, args ...core.Value) (core.Value, error) {
|
|||||||
|
|
||||||
// 0666 - read & write
|
// 0666 - read & write
|
||||||
file, err := os.OpenFile(fpath, params.ModeFlag, 0666)
|
file, err := os.OpenFile(fpath, params.ModeFlag, 0666)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return values.None, core.Error(err, "open file")
|
return values.None, core.Error(err, "open file")
|
||||||
}
|
}
|
||||||
|
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
_, err = file.Write(data)
|
_, err = file.Write(data)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return values.None, core.Error(err, "write file")
|
return values.None, core.Error(err, "write file")
|
||||||
}
|
}
|
||||||
@ -55,18 +69,15 @@ func Write(_ context.Context, args ...core.Value) (core.Value, error) {
|
|||||||
|
|
||||||
func validateRequiredWriteArgs(args []core.Value) error {
|
func validateRequiredWriteArgs(args []core.Value) error {
|
||||||
err := core.ValidateArgs(args, 2, 3)
|
err := core.ValidateArgs(args, 2, 3)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return core.Error(err, "validate arguments number")
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
pairs := []core.PairValueType{
|
err = core.ValidateType(args[0], types.String)
|
||||||
core.NewPairValueType(args[0], types.String),
|
|
||||||
core.NewPairValueType(args[1], types.Binary),
|
|
||||||
}
|
|
||||||
|
|
||||||
err = core.ValidateValueTypePairs(pairs...)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return core.Error(err, "validate arguments")
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -83,20 +94,21 @@ var defaultParams = parsedParams{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func parseParams(value core.Value) (parsedParams, error) {
|
func parseParams(value core.Value) (parsedParams, error) {
|
||||||
obj, ok := value.(*values.Object)
|
err := core.ValidateType(value, types.Object)
|
||||||
if !ok {
|
|
||||||
return parsedParams{}, core.Error(
|
if err != nil {
|
||||||
core.ErrInvalidArgument,
|
return parsedParams{}, err
|
||||||
"value should be an object",
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
obj := value.(*values.Object)
|
||||||
|
|
||||||
params := defaultParams
|
params := defaultParams
|
||||||
|
|
||||||
modestr, exists := obj.Get(values.NewString("mode"))
|
modestr, exists := obj.Get(values.NewString("mode"))
|
||||||
if exists {
|
|
||||||
|
|
||||||
|
if exists {
|
||||||
flag, err := parseWriteMode(modestr.String())
|
flag, err := parseWriteMode(modestr.String())
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return parsedParams{}, core.Error(
|
return parsedParams{}, core.Error(
|
||||||
core.ErrInvalidArgument,
|
core.ErrInvalidArgument,
|
||||||
@ -142,10 +154,8 @@ func parseWriteMode(s string) (int, error) {
|
|||||||
switch letters[0] {
|
switch letters[0] {
|
||||||
case 'a':
|
case 'a':
|
||||||
flag |= os.O_APPEND
|
flag |= os.O_APPEND
|
||||||
|
|
||||||
case 'w':
|
case 'w':
|
||||||
flag |= os.O_TRUNC
|
flag |= os.O_TRUNC
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -1, core.Errorf(
|
return -1, core.Errorf(
|
||||||
core.ErrInvalidArgument,
|
core.ErrInvalidArgument,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user