feat: Replace data fillcontent with custom reader
This commit is contained in:
66
content.go
Normal file
66
content.go
Normal file
@ -0,0 +1,66 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user