package uring

// import (
// 	"context"
// 	"os"

// 	"github.com/iceber/iouring-go"
// 	"go.opentelemetry.io/otel"
// 	"go.opentelemetry.io/otel/attribute"
// 	"go.opentelemetry.io/otel/trace"
// )

// var tracer = otel.Tracer("github.com/royalcat/tstor/pkg/uring")

// type FS struct {
// 	ur *iouring.IOURing
// }

// func NewFS(ur *iouring.IOURing) *FS {
// 	return &FS{
// 		ur: ur,
// 	}
// }

// func (o *FS) OpenFile(ctx context.Context, name string) (File, error) {
// 	ctx, span := tracer.Start(ctx, "uring.FS.OpenFile", trace.WithAttributes(attribute.String("name", name)))
// 	defer span.End()

// 	f, err := os.Open(name)
// 	if err != nil {
// 		return File{}, err
// 	}

// 	return File{
// 		ur: o.ur,
// 		f:  f,
// 	}, nil
// }

// func NewFile(ur *iouring.IOURing, f *os.File) *File {
// 	return &File{
// 		ur: ur,
// 		f:  f,
// 	}
// }

// type File struct {
// 	ur *iouring.IOURing
// 	f  *os.File
// }

// func (o *File) pread(ctx context.Context, b []byte, off uint64) (int, error) {
// 	ctx, span := tracer.Start(ctx, "uring.File.pread", trace.WithAttributes(attribute.Int("size", len(b))))
// 	defer span.End()

// 	req, err := o.ur.Pread(o.f, b, off, nil)
// 	if err != nil {
// 		return 0, err
// 	}

// 	select {
// 	case <-req.Done():
// 		return req.GetRes()
// 	case <-ctx.Done():
// 		if _, err := req.Cancel(); err != nil {
// 			return 0, err
// 		}
// 		<-req.Done()
// 		return 0, ctx.Err()
// 	}
// }

// func (f *File) ReadAt(ctx context.Context, b []byte, off int64) (n int, err error) {
// 	ctx, span := tracer.Start(ctx, "uring.File.ReadAt", trace.WithAttributes(attribute.Int("size", len(b))))
// 	defer span.End()

// 	return f.f.ReadAt(b, off)

// 	for len(b) > 0 {
// 		if ctx.Err() != nil {
// 			err = ctx.Err()
// 			break
// 		}

// 		m, e := f.pread(ctx, b, uint64(off))
// 		if e != nil {
// 			err = e
// 			break
// 		}
// 		n += m
// 		b = b[m:]
// 		off += int64(m)
// 	}

// 	return n, err
// }

// func (o *File) Close(ctx context.Context) error {
// 	return o.f.Close()
// }

// func waitRequest(ctx context.Context, req iouring.Request) (int, error) {
// 	select {
// 	case <-req.Done():
// 		return req.GetRes()
// 	case <-ctx.Done():
// 		if _, err := req.Cancel(); err != nil {
// 			return 0, err
// 		}
// 		return 0, ctx.Err()
// 	}
// }