49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
// Package greeter is a minimal example domain package.
|
|
// It demonstrates how to:
|
|
// - define an interface (satisfied by manual fakes in tests)
|
|
// - inject dependencies (logger) through a constructor
|
|
// - use the logger.WithField pattern
|
|
//
|
|
// Replace this package with your own domain logic.
|
|
package greeter
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"gitea.djmil.dev/go/template/internal/logger"
|
|
"gitea.djmil.dev/go/template/pkg/result"
|
|
)
|
|
|
|
// Greeter produces a greeting for a given name.
|
|
// The interface is what other packages should depend on — never the concrete type.
|
|
type Greeter interface {
|
|
Greet(name string) result.Expect[string]
|
|
}
|
|
|
|
// Service is the concrete implementation.
|
|
type Service struct {
|
|
log *logger.Logger
|
|
}
|
|
|
|
// New creates a Greeter service with the provided logger.
|
|
func New(log *logger.Logger) *Service {
|
|
return &Service{log: log}
|
|
}
|
|
|
|
// Greet returns a personalized greeting and logs the interaction.
|
|
func (s *Service) Greet(name string) result.Expect[string] {
|
|
if name == "" {
|
|
return result.Fail[string](errors.New("Greet: name must not be empty"))
|
|
}
|
|
|
|
msg := fmt.Sprintf("Hello, %s!", name)
|
|
|
|
s.log.
|
|
WithField("component", "greeter").
|
|
WithField("name", name).
|
|
Info("greeting generated")
|
|
|
|
return result.Ok(msg)
|
|
}
|