go-tour/src/go-tour/rot13reader.go

37 lines
574 B
Go

package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
func (rot13 *rot13Reader) Read(b []byte) (int, error) {
n, err := rot13.r.Read(b)
if err != nil {
return n, err
}
for i, e := range b {
b[i] = rot13shift(e)
}
return n, nil
}
func rot13shift(b byte) byte {
switch {
case (b >= 'A' && b <= 'M') || (b >= 'a' && b <= 'm'): b += 13
case (b >= 'N' && b <= 'Z') || (b >= 'n' && b <= 'z'): b -= 13
}
return b
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}