github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/types/paths/marshal.go (about) 1 package paths 2 3 import ( 4 "bytes" 5 "fmt" 6 "strings" 7 8 "github.com/lmorg/murex/lang" 9 "github.com/lmorg/murex/lang/types" 10 "github.com/lmorg/murex/utils/path" 11 ) 12 13 func marshalPath(_ *lang.Process, v interface{}) ([]byte, error) { 14 return path.Marshal(v) 15 } 16 17 func unmarshalPath(p *lang.Process) (interface{}, error) { 18 b, err := p.Stdin.ReadAll() 19 if err != nil { 20 return nil, err 21 } 22 23 return path.Unmarshal(b) 24 } 25 26 func marshalPaths(_ *lang.Process, v interface{}) ([]byte, error) { 27 switch t := v.(type) { 28 case string: 29 return []byte(t), nil 30 case []string: 31 s := strings.Join(t, string(pathsSeparator)) 32 return []byte(s), nil 33 case []interface{}: 34 a := make([]string, len(t)) 35 for i := range t { 36 s, err := types.ConvertGoType(t[i], types.String) 37 if err != nil { 38 return nil, err 39 } 40 a[i] = s.(string) 41 } 42 return []byte(strings.Join(a, string(pathsSeparator))), nil 43 default: 44 return nil, fmt.Errorf("%s can only marshal arrays. Instead got %T", types.Paths, t) 45 } 46 } 47 48 func unmarshalPaths(p *lang.Process) (interface{}, error) { 49 b, err := p.Stdin.ReadAll() 50 if err != nil { 51 return nil, err 52 } 53 54 split := bytes.Split(b, pathsSeparator) 55 a := make([]interface{}, len(split)) 56 for i := range split { 57 a[i] = string(split[i]) 58 } 59 return a, nil 60 }