mirror of
https://github.com/derfenix/photocatalog.git
synced 2026-03-11 20:46:24 +03:00
Full application rewrite
This commit is contained in:
64
application/application.go
Normal file
64
application/application.go
Normal 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
41
application/config.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user