feat(usecase): add CopyURLUseCase for clipboard operations
- commit
- c4effaa22b6c06051204f787238c850940c88fb9
- author
- brice · · 2025-12-17 19:37 UTC
- committer
- brice · · 2025-12-17 19:16 UTC
- parent
- f7dbba0
- signature
- unsigned
1 file · +47 -0
A internal/application/usecase/copy_url.go +47 -0
| @@ -0,0 +1,47 @@ | |||
| 1 | + | // Package usecase contains application business logic. | |
| 2 | + | package usecase | |
| 3 | + | ||
| 4 | + | import ( | |
| 5 | + | "context" | |
| 6 | + | "fmt" | |
| 7 | + | ||
| 8 | + | "github.com/bnema/dumber/internal/application/port" | |
| 9 | + | "github.com/bnema/dumber/internal/logging" | |
| 10 | + | ) | |
| 11 | + | ||
| 12 | + | // CopyURLUseCase handles copying URLs to the system clipboard. | |
| 13 | + | type CopyURLUseCase struct { | |
| 14 | + | clipboard port.Clipboard | |
| 15 | + | } | |
| 16 | + | ||
| 17 | + | // NewCopyURLUseCase creates a new CopyURLUseCase. | |
| 18 | + | func NewCopyURLUseCase(clipboard port.Clipboard) *CopyURLUseCase { | |
| 19 | + | return &CopyURLUseCase{ | |
| 20 | + | clipboard: clipboard, | |
| 21 | + | } | |
| 22 | + | } | |
| 23 | + | ||
| 24 | + | // Copy copies the given URL to the clipboard. | |
| 25 | + | // Returns nil on success, error on failure. | |
| 26 | + | // The caller is responsible for showing toast notifications on the UI thread. | |
| 27 | + | func (uc *CopyURLUseCase) Copy(ctx context.Context, url string) error { | |
| 28 | + | log := logging.FromContext(ctx) | |
| 29 | + | ||
| 30 | + | if url == "" { | |
| 31 | + | log.Debug().Msg("copy URL: empty URL") | |
| 32 | + | return fmt.Errorf("empty URL") | |
| 33 | + | } | |
| 34 | + | ||
| 35 | + | if uc.clipboard == nil { | |
| 36 | + | log.Warn().Msg("copy URL: clipboard is nil") | |
| 37 | + | return fmt.Errorf("clipboard not available") | |
| 38 | + | } | |
| 39 | + | ||
| 40 | + | if err := uc.clipboard.WriteText(ctx, url); err != nil { | |
| 41 | + | log.Error().Err(err).Str("url", url).Msg("copy URL: clipboard write failed") | |
| 42 | + | return fmt.Errorf("clipboard write failed: %w", err) | |
| 43 | + | } | |
| 44 | + | ||
| 45 | + | log.Debug().Str("url", url).Msg("URL copied to clipboard") | |
| 46 | + | return nil | |
| 47 | + | } | |
| @@ -0,0 +1,47 @@ | |||||
| 1 | + | // Package usecase contains application business logic. | |||
| 2 | + | package usecase | |||
| 3 | + | ||||
| 4 | + | import ( | |||
| 5 | + | "context" | |||
| 6 | + | "fmt" | |||
| 7 | + | ||||
| 8 | + | "github.com/bnema/dumber/internal/application/port" | |||
| 9 | + | "github.com/bnema/dumber/internal/logging" | |||
| 10 | + | ) | |||
| 11 | + | ||||
| 12 | + | // CopyURLUseCase handles copying URLs to the system clipboard. | |||
| 13 | + | type CopyURLUseCase struct { | |||
| 14 | + | clipboard port.Clipboard | |||
| 15 | + | } | |||
| 16 | + | ||||
| 17 | + | // NewCopyURLUseCase creates a new CopyURLUseCase. | |||
| 18 | + | func NewCopyURLUseCase(clipboard port.Clipboard) *CopyURLUseCase { | |||
| 19 | + | return &CopyURLUseCase{ | |||
| 20 | + | clipboard: clipboard, | |||
| 21 | + | } | |||
| 22 | + | } | |||
| 23 | + | ||||
| 24 | + | // Copy copies the given URL to the clipboard. | |||
| 25 | + | // Returns nil on success, error on failure. | |||
| 26 | + | // The caller is responsible for showing toast notifications on the UI thread. | |||
| 27 | + | func (uc *CopyURLUseCase) Copy(ctx context.Context, url string) error { | |||
| 28 | + | log := logging.FromContext(ctx) | |||
| 29 | + | ||||
| 30 | + | if url == "" { | |||
| 31 | + | log.Debug().Msg("copy URL: empty URL") | |||
| 32 | + | return fmt.Errorf("empty URL") | |||
| 33 | + | } | |||
| 34 | + | ||||
| 35 | + | if uc.clipboard == nil { | |||
| 36 | + | log.Warn().Msg("copy URL: clipboard is nil") | |||
| 37 | + | return fmt.Errorf("clipboard not available") | |||
| 38 | + | } | |||
| 39 | + | ||||
| 40 | + | if err := uc.clipboard.WriteText(ctx, url); err != nil { | |||
| 41 | + | log.Error().Err(err).Str("url", url).Msg("copy URL: clipboard write failed") | |||
| 42 | + | return fmt.Errorf("clipboard write failed: %w", err) | |||
| 43 | + | } | |||
| 44 | + | ||||
| 45 | + | log.Debug().Str("url", url).Msg("URL copied to clipboard") | |||
| 46 | + | return nil | |||
| 47 | + | } | |||