github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/types/string/marshal.go (about)

     1  package string
     2  
     3  import (
     4  	"bufio"
     5  	"errors"
     6  	"fmt"
     7  	"strings"
     8  
     9  	"github.com/lmorg/murex/lang"
    10  	"github.com/lmorg/murex/lang/types"
    11  	"github.com/lmorg/murex/utils"
    12  )
    13  
    14  func marshal(_ *lang.Process, iface interface{}) (b []byte, err error) {
    15  	switch v := iface.(type) {
    16  	case string:
    17  		b = []byte(v)
    18  		return
    19  
    20  	case []string:
    21  		for i := range v {
    22  			b = append(b, []byte(v[i]+utils.NewLineString)...)
    23  		}
    24  		return
    25  
    26  	case []interface{}:
    27  		for i := range v {
    28  			b = append(b, []byte(fmt.Sprintln(v[i]))...)
    29  		}
    30  		return
    31  
    32  	case map[string]string:
    33  		for s := range v {
    34  			b = append(b, []byte(s+": "+v[s]+utils.NewLineString)...)
    35  		}
    36  		return
    37  
    38  	case map[string]interface{}:
    39  		for s := range v {
    40  			b = append(b, []byte(fmt.Sprintf("%s: %s%s", s, fmt.Sprint(v[s]), utils.NewLineString))...)
    41  		}
    42  		return
    43  
    44  	case map[interface{}]interface{}:
    45  		for s := range v {
    46  			b = append(b, []byte(fmt.Sprintf("%s: %s%s", fmt.Sprint(s), fmt.Sprint(v[s]), utils.NewLineString))...)
    47  		}
    48  		return
    49  
    50  	case map[interface{}]string:
    51  		for s := range v {
    52  			b = append(b, []byte(fmt.Sprintf("%s: %s%s", fmt.Sprint(s), v[s], utils.NewLineString))...)
    53  		}
    54  		return
    55  
    56  	case interface{}:
    57  		return []byte(fmt.Sprintln(iface)), nil
    58  
    59  	default:
    60  		err = errors.New("I don't know how to marshal that data into a `str`. Data possibly too complex?")
    61  		return
    62  	}
    63  }
    64  
    65  func unmarshal(p *lang.Process) (interface{}, error) {
    66  	s := make([]string, 0)
    67  
    68  	scanner := bufio.NewScanner(p.Stdin)
    69  	for scanner.Scan() {
    70  		s = append(s, strings.TrimSpace(scanner.Text()))
    71  	}
    72  
    73  	err := scanner.Err()
    74  	if err != nil {
    75  		return s, fmt.Errorf("error while unmarshalling %s document: %s", types.String, err.Error())
    76  	}
    77  
    78  	return s, nil
    79  }