package nar

import (
	"io/fs"
	"os"
)

type DirFS string

func (dir DirFS) Open(name string) (fs.File, error) {
	if !fs.ValidPath(name) {
		return nil, &fs.PathError{Op: "open", Path: name, Err: fs.ErrInvalid}
	}
	f, err := os.Open(dir.Join(name))
	if err != nil {
		return nil, err
	}
	return f, nil
}

func (dir DirFS) Stat(name string) (fs.FileInfo, error) {
	if !fs.ValidPath(name) {
		return nil, &fs.PathError{Op: "stat", Path: name, Err: fs.ErrInvalid}
	}
	f, err := os.Stat(dir.Join(name))
	if err != nil {
		return nil, err
	}
	return f, nil
}

func (dir DirFS) Lstat(name string) (fs.FileInfo, error) {
	if !fs.ValidPath(name) {
		return nil, &fs.PathError{Op: "lstat", Path: name, Err: fs.ErrInvalid}
	}
	f, err := os.Lstat(dir.Join(name))
	if err != nil {
		return nil, err
	}
	return f, nil
}

func (dir DirFS) Readlink(name string) (string, error) {
	if !fs.ValidPath(name) {
		return "", &fs.PathError{Op: "readlink", Path: name, Err: fs.ErrInvalid}
	}
	f, err := os.Readlink(dir.Join(name))
	if err != nil {
		return "", err
	}
	return f, nil
}

func (dir DirFS) Join(name string) string {
	return string(dir) + string(os.PathSeparator) + name
}