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 }