mirror of
https://github.com/gotenberg/gotenberg.git
synced 2026-08-16 12:22:17 +01:00
feat(pdfengines): add split feature
This commit is contained in:
@@ -3,22 +3,56 @@ package gotenberg
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
// MkdirAll defines the method signature for create a directory. Implement this
|
||||
// interface if you don't want to rely on [os.MkdirAll], notably for testing
|
||||
// purpose.
|
||||
type MkdirAll interface {
|
||||
// MkdirAll uses the same signature as [os.MkdirAll].
|
||||
MkdirAll(path string, perm os.FileMode) error
|
||||
}
|
||||
|
||||
// OsMkdirAll implements the [MkdirAll] interface with [os.MkdirAll].
|
||||
type OsMkdirAll struct{}
|
||||
|
||||
// MkdirAll is a wrapper around [os.MkdirAll].
|
||||
func (o *OsMkdirAll) MkdirAll(path string, perm os.FileMode) error { return os.MkdirAll(path, perm) }
|
||||
|
||||
// PathRename defines the method signature for renaming files. Implement this
|
||||
// interface if you don't want to rely on [os.Rename], notably for testing
|
||||
// purpose.
|
||||
type PathRename interface {
|
||||
// Rename uses the same signature as [os.Rename].
|
||||
Rename(oldpath, newpath string) error
|
||||
}
|
||||
|
||||
// OsPathRename implements the [PathRename] interface with [os.Rename].
|
||||
type OsPathRename struct{}
|
||||
|
||||
// Rename is a wrapper around [os.Rename].
|
||||
func (o *OsPathRename) Rename(oldpath, newpath string) error {
|
||||
return os.Rename(oldpath, newpath)
|
||||
}
|
||||
|
||||
// FileSystem provides utilities for managing temporary directories. It creates
|
||||
// unique directory names based on UUIDs to ensure isolation of temporary files
|
||||
// for different modules.
|
||||
type FileSystem struct {
|
||||
workingDir string
|
||||
mkdirAll MkdirAll
|
||||
}
|
||||
|
||||
// NewFileSystem initializes a new [FileSystem] instance with a unique working
|
||||
// directory.
|
||||
func NewFileSystem() *FileSystem {
|
||||
func NewFileSystem(mkdirAll MkdirAll) *FileSystem {
|
||||
return &FileSystem{
|
||||
workingDir: uuid.NewString(),
|
||||
mkdirAll: mkdirAll,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,7 +78,7 @@ func (fs *FileSystem) NewDirPath() string {
|
||||
func (fs *FileSystem) MkdirAll() (string, error) {
|
||||
path := fs.NewDirPath()
|
||||
|
||||
err := os.MkdirAll(path, 0o755)
|
||||
err := fs.mkdirAll.MkdirAll(path, 0o755)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("create directory %s: %w", path, err)
|
||||
}
|
||||
@@ -52,10 +86,27 @@ func (fs *FileSystem) MkdirAll() (string, error) {
|
||||
return path, nil
|
||||
}
|
||||
|
||||
// PathRename defines the method signature for renaming files. Implement this
|
||||
// interface if you don't want to rely on [os.Rename], notably for testing
|
||||
// purpose.
|
||||
type PathRename interface {
|
||||
// Rename uses the same signature as [os.Rename].
|
||||
Rename(oldpath, newpath string) error
|
||||
// WalkDir walks through the root level of a directory and returns a list of
|
||||
// files paths that match the specified file extension.
|
||||
func WalkDir(dir, ext string) ([]string, error) {
|
||||
var files []string
|
||||
err := filepath.Walk(dir, func(path string, info os.FileInfo, pathErr error) error {
|
||||
if pathErr != nil {
|
||||
return pathErr
|
||||
}
|
||||
if info.IsDir() {
|
||||
return nil
|
||||
}
|
||||
if strings.EqualFold(filepath.Ext(info.Name()), ext) {
|
||||
files = append(files, path)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
return files, err
|
||||
}
|
||||
|
||||
// Interface guards.
|
||||
var (
|
||||
_ MkdirAll = (*OsMkdirAll)(nil)
|
||||
_ PathRename = (*OsPathRename)(nil)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user