67 lines
999 B
Go
67 lines
999 B
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
)
|
|
|
|
const contentCharset = "-ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
|
|
type contentReader struct {
|
|
size int64
|
|
cur int64
|
|
}
|
|
|
|
// Read implements the io.Read interface.
|
|
func (r *contentReader) Read(p []byte) (int, error) {
|
|
length := r.size - 1
|
|
|
|
if r.cur >= length {
|
|
return 0, io.EOF
|
|
}
|
|
if len(p) == 0 {
|
|
return 0, nil
|
|
}
|
|
|
|
var n int
|
|
if r.cur == 0 {
|
|
p[n] = '|'
|
|
r.cur++
|
|
n++
|
|
}
|
|
|
|
for n < len(p) && r.cur <= length {
|
|
p[n] = contentCharset[int(r.cur)%len(contentCharset)]
|
|
r.cur++
|
|
n++
|
|
}
|
|
|
|
if r.cur >= length {
|
|
p[n-1] = '|'
|
|
}
|
|
|
|
return n, nil
|
|
}
|
|
|
|
// Seek implements the io.Seek interface.
|
|
func (r *contentReader) Seek(offset int64, whence int) (int64, error) {
|
|
switch whence {
|
|
default:
|
|
return 0, errors.New("seek: invalid whence")
|
|
case io.SeekStart:
|
|
offset += 0
|
|
case io.SeekCurrent:
|
|
offset += r.cur
|
|
case io.SeekEnd:
|
|
offset += r.size - 1
|
|
}
|
|
|
|
if offset < 0 {
|
|
return 0, errors.New("seek: invalid offset")
|
|
}
|
|
|
|
r.cur = offset
|
|
|
|
return offset, nil
|
|
}
|