github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/optional/encoders/gz.go (about)

     1  package encoders
     2  
     3  import (
     4  	"compress/gzip"
     5  	"io"
     6  
     7  	"github.com/lmorg/murex/lang"
     8  	"github.com/lmorg/murex/lang/types"
     9  )
    10  
    11  func init() {
    12  	lang.DefineMethod("gz", cmdGz, types.Any, types.Binary)
    13  	lang.DefineMethod("!gz", cmdUngz, types.Generic, types.Generic)
    14  }
    15  
    16  func cmdGz(p *lang.Process) (err error) {
    17  	if err = p.ErrIfNotAMethod(); err != nil {
    18  		p.Stdout.SetDataType(types.Null)
    19  		return err
    20  	}
    21  
    22  	p.Stdout.SetDataType(types.Binary)
    23  	gz := gzip.NewWriter(p.Stdout)
    24  	_, err = io.Copy(gz, p.Stdin)
    25  	if err != nil {
    26  		return err
    27  	}
    28  
    29  	gz.Close()
    30  
    31  	return nil
    32  }
    33  
    34  func cmdUngz(p *lang.Process) error {
    35  	if err := p.ErrIfNotAMethod(); err != nil {
    36  		p.Stdout.SetDataType(types.Null)
    37  		return err
    38  	}
    39  
    40  	p.Stdout.SetDataType(types.Generic)
    41  	gz, err := gzip.NewReader(p.Stdin)
    42  	if err != nil {
    43  		return err
    44  	}
    45  
    46  	_, err = io.Copy(p.Stdout, gz)
    47  	if err != nil {
    48  		return err
    49  	}
    50  
    51  	gz.Close()
    52  	return nil
    53  }