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  }