1package cmd23import (4 "bufio"5 "bytes"6 "fmt"7 "io"8)910type CryptFn func(in io.Reader, inLen int64, out io.Writer) (int, error)1112func Handle(in io.Reader, out io.Writer, fn CryptFn) error {13 reader := bufio.NewReader(in)14 for {15 line, err := reader.ReadString('\n')16 if err != nil {17 if err == io.EOF {18 break19 }20 return err21 }2223 var numBytes uint24 n, _ := fmt.Sscanf(line, "data %d\n", &numBytes)25 if n != 1 || numBytes == 0 {26 fmt.Fprint(out, line)27 continue28 }2930 writer := bytes.NewBuffer(nil)31 n, err = fn(reader, int64(numBytes), writer)32 if err != nil {33 return err34 }3536 fmt.Fprintf(out, "data %d\n", n)37 _, err = writer.WriteTo(out)38 if err != nil {39 return err40 }41 }4243 return nil44}