Full application rewrite

This commit is contained in:
2025-01-04 01:49:48 +03:00
parent 70f32b799c
commit 754aecd69a
32 changed files with 1244 additions and 489 deletions

View File

@@ -0,0 +1,64 @@
package application
import (
"context"
"fmt"
"log"
"os"
"sync"
"github.com/derfenix/photocatalog/internal/organizer"
"github.com/derfenix/photocatalog/internal/organizer/modes"
)
type Application struct {
config Config
}
func NewApplication(config Config) (Application, error) {
if err := config.Validate(); err != nil {
return Application{}, fmt.Errorf("invalid config: %w", err)
}
return Application{config: config}, nil
}
func (a *Application) Start(ctx context.Context, wg *sync.WaitGroup) error {
var mode organizer.Mode
switch a.config.Mode {
case ModeCopy:
mode = modes.Copy{}
case ModeHardlink:
mode = modes.HardLink{}
case ModeMove:
mode = modes.Move{}
case ModeSymlink:
mode = modes.SymLink{}
default:
mode = modes.HardLink{}
}
org := organizer.NewOrganizer(mode, a.config.SourceDir, a.config.TargetDir).
WithDirMode(os.FileMode(a.config.DirMode)).
WithFileMode(os.FileMode(a.config.FileMode)).
WithErrLogger(func(err error) {
log.Println(err)
})
if a.config.Overwrite {
org = org.WithOverwrite()
}
if err := org.FullSync(ctx); err != nil {
return fmt.Errorf("full sync: %w", err)
}
if a.config.Watch {
if err := org.Watch(ctx, wg); err != nil {
return fmt.Errorf("initialize watch: %w", err)
}
}
return nil
}

41
application/config.go Normal file
View File

@@ -0,0 +1,41 @@
package application
import (
"fmt"
"slices"
)
type Mode string
const (
ModeCopy Mode = "copy"
ModeHardlink Mode = "hardlink"
ModeSymlink Mode = "symlink"
ModeMove Mode = "move"
)
type Config struct {
SourceDir string
TargetDir string
Mode Mode
Overwrite bool
DirMode uint64
FileMode uint64
Watch bool
}
func (c *Config) Validate() error {
if c.SourceDir == "" {
return fmt.Errorf("source dir is required")
}
if c.TargetDir == "" {
return fmt.Errorf("target dir is required")
}
if !slices.Contains([]Mode{ModeHardlink, ModeSymlink, ModeMove, ModeSymlink}, c.Mode) {
return fmt.Errorf("invalid mode %s", c.Mode)
}
return nil
}