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 }