1
0
Fork 0
mirror of https://github.com/imjasonh/gcsbuf synced 2026-07-08 00:55:41 +00:00
gcsbuf/cmd/gcscat/main.go
Jason Hall f6fd234e2d add test binary, observability
Signed-off-by: Jason Hall <imjasonh@gmail.com>
2026-03-24 14:54:02 -04:00

72 lines
1.3 KiB
Go

package main
import (
"context"
"fmt"
"io"
"log/slog"
"os"
"sync"
"time"
"cloud.google.com/go/storage"
buf "github.com/imjasonh/gcsbuf"
)
func main() {
if len(os.Args) != 3 {
fmt.Fprintf(os.Stderr, "usage: gcscat <bucket> <object>\n")
os.Exit(1)
}
bucket, object := os.Args[1], os.Args[2]
ctx := context.Background()
client, err := storage.NewClient(ctx)
if err != nil {
slog.Error("creating storage client", "err", err)
os.Exit(1)
}
defer client.Close()
onOp := buf.OnOp(func(op string, d time.Duration, err error) {
if err != nil {
slog.Error("gcs", "op", op, "dur", d, "err", err)
} else {
slog.Info("gcs", "op", op, "dur", d)
}
})
w := buf.NewWriter(ctx, buf.WriterOptions{
Client: client,
Bucket: bucket,
Object: object,
OnOp: onOp,
})
r := buf.NewReader(ctx, buf.ReaderOptions{
Client: client,
Bucket: bucket,
Object: object,
OnOp: onOp,
})
// Read concurrently, printing to stdout.
var wg sync.WaitGroup
wg.Go(func() {
if _, err := io.Copy(os.Stdout, r); err != nil {
slog.Error("read", "err", err)
}
})
// Write stdin to GCS.
if _, err := io.Copy(w, os.Stdin); err != nil {
slog.Error("write", "err", err)
os.Exit(1)
}
if err := w.Close(); err != nil {
slog.Error("close writer", "err", err)
os.Exit(1)
}
wg.Wait()
}