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  }