mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2024-12-17 22:16:30 +00:00
73 lines
1.1 KiB
Go
73 lines
1.1 KiB
Go
|
package fscache
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"errors"
|
||
|
"io"
|
||
|
)
|
||
|
|
||
|
type decoder interface {
|
||
|
Decode(interface{}) error
|
||
|
}
|
||
|
|
||
|
type encoder interface {
|
||
|
Encode(interface{}) error
|
||
|
}
|
||
|
|
||
|
type pktReader struct {
|
||
|
dec decoder
|
||
|
}
|
||
|
|
||
|
type pktWriter struct {
|
||
|
enc encoder
|
||
|
}
|
||
|
|
||
|
type packet struct {
|
||
|
Err int
|
||
|
Data []byte
|
||
|
}
|
||
|
|
||
|
const eof = 1
|
||
|
|
||
|
func (t *pktReader) ReadAt(p []byte, off int64) (n int, err error) {
|
||
|
// TODO not implemented
|
||
|
return 0, errors.New("not implemented")
|
||
|
}
|
||
|
|
||
|
func (t *pktReader) Read(p []byte) (int, error) {
|
||
|
var pkt packet
|
||
|
err := t.dec.Decode(&pkt)
|
||
|
if err != nil {
|
||
|
return 0, err
|
||
|
}
|
||
|
if pkt.Err == eof {
|
||
|
return 0, io.EOF
|
||
|
}
|
||
|
return copy(p, pkt.Data), nil
|
||
|
}
|
||
|
|
||
|
func (t *pktReader) Close() error {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (t *pktWriter) Write(p []byte) (int, error) {
|
||
|
pkt := packet{Data: p}
|
||
|
err := t.enc.Encode(pkt)
|
||
|
if err != nil {
|
||
|
return 0, err
|
||
|
}
|
||
|
return len(p), nil
|
||
|
}
|
||
|
|
||
|
func (t *pktWriter) Close() error {
|
||
|
return t.enc.Encode(packet{Err: eof})
|
||
|
}
|
||
|
|
||
|
func newEncoder(w io.Writer) io.WriteCloser {
|
||
|
return &pktWriter{enc: json.NewEncoder(w)}
|
||
|
}
|
||
|
|
||
|
func newDecoder(r io.Reader) ReadAtCloser {
|
||
|
return &pktReader{dec: json.NewDecoder(r)}
|
||
|
}
|