databricks-cli/libs/template/file.go

81 lines
1.8 KiB
Go
Raw Normal View History

package template
import (
"bytes"
"context"
"io/fs"
"slices"
"github.com/databricks/cli/libs/filer"
)
// Interface representing a file to be materialized from a template into a project
// instance
type file interface {
// Path of the file relative to the root of the instantiated template.
// This is where the file is written to when persisting the template to disk.
// Must be slash-separated.
RelPath() string
// Write file to disk at the destination path.
Write(ctx context.Context, out filer.Filer) error
// contents returns the file contents as a byte slice.
// This is used for testing purposes.
contents() ([]byte, error)
}
type copyFile struct {
// Permissions bits for the destination file
perm fs.FileMode
// Destination path for the file.
relPath string
// [fs.FS] rooted at template root. Used to read srcPath.
srcFS fs.FS
// Relative path from template root for file to be copied.
srcPath string
}
func (f *copyFile) RelPath() string {
return f.relPath
}
func (f *copyFile) Write(ctx context.Context, out filer.Filer) error {
src, err := f.srcFS.Open(f.srcPath)
if err != nil {
return err
}
defer src.Close()
return out.Write(ctx, f.relPath, src, filer.CreateParentDirectories, filer.WriteMode(f.perm))
}
func (f *copyFile) contents() ([]byte, error) {
return fs.ReadFile(f.srcFS, f.srcPath)
}
type inMemoryFile struct {
// Permissions bits for the destination file
perm fs.FileMode
// Destination path for the file.
relPath string
// Contents of the file.
content []byte
}
func (f *inMemoryFile) RelPath() string {
return f.relPath
}
func (f *inMemoryFile) Write(ctx context.Context, out filer.Filer) error {
return out.Write(ctx, f.relPath, bytes.NewReader(f.content), filer.CreateParentDirectories, filer.WriteMode(f.perm))
}
func (f *inMemoryFile) contents() ([]byte, error) {
return slices.Clone(f.content), nil
}