github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/lists/mtac.go (about) 1 package lists 2 3 import ( 4 "fmt" 5 6 "github.com/lmorg/murex/lang" 7 "github.com/lmorg/murex/lang/types" 8 ) 9 10 func init() { 11 lang.DefineMethod("mtac", cmdMtac, types.Unmarshal, types.Marshal) 12 } 13 14 func cmdMtac(p *lang.Process) error { 15 dt := p.Stdin.GetDataType() 16 p.Stdout.SetDataType(dt) 17 18 if err := p.ErrIfNotAMethod(); err != nil { 19 return err 20 } 21 22 v, err := lang.UnmarshalData(p, dt) 23 if err != nil { 24 return err 25 } 26 27 var b []byte 28 29 switch v := v.(type) { 30 case []string: 31 for i := len(v)/2 - 1; i >= 0; i-- { 32 opp := len(v) - 1 - i 33 v[i], v[opp] = v[opp], v[i] 34 } 35 36 case [][]string: 37 for i := len(v)/2 - 1; i >= 0; i-- { 38 opp := len(v) - 1 - i 39 v[i], v[opp] = v[opp], v[i] 40 } 41 42 case []int: 43 for i := len(v)/2 - 1; i >= 0; i-- { 44 opp := len(v) - 1 - i 45 v[i], v[opp] = v[opp], v[i] 46 } 47 48 case []float64: 49 for i := len(v)/2 - 1; i >= 0; i-- { 50 opp := len(v) - 1 - i 51 v[i], v[opp] = v[opp], v[i] 52 } 53 54 case []bool: 55 for i := len(v)/2 - 1; i >= 0; i-- { 56 opp := len(v) - 1 - i 57 v[i], v[opp] = v[opp], v[i] 58 } 59 60 case []interface{}: 61 for i := len(v)/2 - 1; i >= 0; i-- { 62 opp := len(v) - 1 - i 63 v[i], v[opp] = v[opp], v[i] 64 } 65 66 default: 67 return fmt.Errorf("murex doesn't know how to read `%T` as an array. Please report this to https://github.com/lmorg/murex/issues", v) 68 } 69 70 b, err = lang.MarshalData(p, dt, v) 71 if err != nil { 72 return err 73 } 74 _, err = p.Stdout.Write(b) 75 return err 76 }