Skip to content

Instantly share code, notes, and snippets.

@ninnemana
Created March 23, 2023 20:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ninnemana/7d07c9ae920355807b87b880881f9327 to your computer and use it in GitHub Desktop.
Save ninnemana/7d07c9ae920355807b87b880881f9327 to your computer and use it in GitHub Desktop.
Variadic Example
package main
import (
"context"
"errors"
"fmt"
)
type (
Service struct {
logger interface{}
db interface{}
}
ServiceOption func(*Service) error
)
func WithLogger(logger interface{}) ServiceOption {
return func(s *Service) error {
if logger == nil {
return errors.New("invalid logger")
}
s.logger = logger
}
}
func NewService(options ...ServiceOption) (*Service, error) {
s := &Service{
db: nil,
logger: nil,
}
for _, opt := range options {
if err := opt(s); err != nil {
return nil, err
}
}
return s, nil
}
type writeArgs struct {
file io.File
logger interface{}
db interface{}
}
type Option func(args *writeArgs) error
func WithLogger(logger interface{}) Option {
return func(args *writeArgs) error {
if logger == nil {
return errors.New("invalid logger")
}
args.logger = logger
}
}
func (s *Service) Write(ctx context.Context, file io.File, options ...Option) error {
args := &writeArgs{
logger: s.logger,
db: s.db,
file: file,
}
for _, option := range options {
if err := option(args); err != nil {
return fmt.Errorf("failed to overwrite write arguments: %w", err)
}
}
// do things with args
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment