Files
drivefs/ro.go
Matheus Sampaio Queiroga 8894b92de6 update path manipulation
Signed-off-by: Matheus Sampaio Queiroga <srherobrine20@gmail.com>
2025-03-17 23:08:07 -03:00

113 lines
2.6 KiB
Go

package drivefs
import (
"io"
"io/fs"
"google.golang.org/api/drive/v3"
)
func (gdrive *Gdrive) ReadLink(name string) (string, error) {
fileNode, err := gdrive.getNode(name)
if err != nil {
return "", err
}
// Loop to check if is shortcut
for limit := 200_000; limit > 0 && fileNode.MimeType == GoogleDriveMimeSyslink; limit-- {
if fileNode, err = gdrive.driveService.Files.Get(fileNode.ShortcutDetails.TargetId).Fields("*").Do(); err != nil {
return "", err
}
}
return gdrive.forwardPathResove(fileNode.Id)
}
func (gdrive *Gdrive) Lstat(name string) (fs.FileInfo, error) {
fileNode, err := gdrive.getNode(name)
if err != nil {
return nil, err
}
return &Stat{fileNode}, nil
}
// Resolve path and return File or Folder Stat
func (gdrive *Gdrive) Stat(path string) (fs.FileInfo, error) {
fileNode, err := gdrive.getNode(path)
if err != nil {
return nil, err
}
// Loop to check if is shortcut
for limit := 200_000; limit > 0 && fileNode.MimeType == GoogleDriveMimeSyslink; limit-- {
if fileNode, err = gdrive.driveService.Files.Get(fileNode.ShortcutDetails.TargetId).Do(); err != nil {
return nil, err
}
}
return &Stat{fileNode}, nil
}
// List files and folder in Directory
func (gdrive *Gdrive) ReadDir(name string) ([]fs.DirEntry, error) {
current, err := (*drive.File)(nil), error(nil)
if current, err = gdrive.getNode(name); err != nil {
return nil, err
}
nodes, err := gdrive.listFiles(current.Id)
if err != nil {
return nil, err
}
entrysSlice := []fs.DirEntry{}
for index := range nodes {
entrysSlice = append(entrysSlice, fs.FileInfoToDirEntry(&Stat{nodes[index]}))
}
return entrysSlice, nil
}
// resolve path and return File stream
func (gdrive *Gdrive) Open(name string) (fs.File, error) {
node, err := gdrive.getNode(name)
if err != nil {
return nil, err
}
if node.MimeType == GoogleDriveMimeFolder {
nodes, err := gdrive.listFiles(node.Id)
if err != nil {
return nil, err
}
nodeFiles := []fs.DirEntry{}
for _, node := range nodes {
nodeFiles = append(nodeFiles, fs.FileInfoToDirEntry(&Stat{File: node}))
}
return &GdriveNode{filename: name, gClient: gdrive, node: node, nodeFiles: nodeFiles, filesOffset: 0, direction: DirectionWrite}, nil
}
boot, err := gdrive.getRequest(gdrive.driveService.Files.Get(node.Id))
if err != nil {
return nil, err
}
return &GdriveNode{
filename: name,
gClient: gdrive,
node: node,
sReadRes: boot,
direction: DirectionReader,
}, nil
}
func (gdrive Gdrive) ReadFile(name string) ([]byte, error) {
file, err := gdrive.Open(name)
if err != nil {
return nil, err
}
defer file.Close()
return io.ReadAll(file)
}