core/dockerutil/options.go
package dockerutil
import (
"context"
"github.com/ory/dockertest/v3"
"github.com/ory/dockertest/v3/docker"
"github.com/synapsecns/sanguine/core/processlog"
)
// Callback is a callback function that is called when a container log process is started.
type Callback func(ctx context.Context, metadata processlog.LogMetadata)
type logOptions struct {
logOptions docker.LogsOptions
//nolint: containedctx
ctx context.Context
pool *dockertest.Pool
callback Callback
processOptions []processlog.StdStreamLogArgsOption
}
// Option is a function that configures a logOptions struct.
type Option func(*logOptions) error
// WithContext sets the context for the TailContainerLogs function.
func WithContext(ctx context.Context) Option {
return func(opts *logOptions) error {
if ctx == nil {
return newContextError("context is nil")
}
opts.ctx = ctx
return nil
}
}
// WithResource sets the resource for the TailContainerLogs function.
func WithResource(resource *dockertest.Resource) Option {
return func(opts *logOptions) error {
if resource == nil {
return newResourceError("resource is nil")
}
opts.logOptions.Container = resource.Container.ID
return nil
}
}
// WithPool sets the pool for the TailContainerLogs function.
func WithPool(pool *dockertest.Pool) Option {
return func(opts *logOptions) error {
if pool == nil {
return newPoolError("pool is nil")
}
opts.pool = pool
return nil
}
}
// WithStderr sets the Stderr option for the TailContainerLogs function.
func WithStderr(stderr bool) Option {
return func(opts *logOptions) error {
opts.logOptions.Stderr = stderr
return nil
}
}
// WithStdout sets the Stdout option for the TailContainerLogs function.
func WithStdout(stdout bool) Option {
return func(opts *logOptions) error {
opts.logOptions.Stdout = stdout
return nil
}
}
// WithFollow sets the Follow option for the TailContainerLogs function.
func WithFollow(follow bool) Option {
return func(opts *logOptions) error {
opts.logOptions.Follow = follow
return nil
}
}
// WithTimestamps sets the Timestamps option for the TailContainerLogs function.
func WithTimestamps(timestamps bool) Option {
return func(opts *logOptions) error {
opts.logOptions.Timestamps = timestamps
return nil
}
}
// WithRawTerminal sets the RawTerminal option for the TailContainerLogs function.
func WithRawTerminal(rawTerminal bool) Option {
return func(opts *logOptions) error {
opts.logOptions.RawTerminal = rawTerminal
return nil
}
}
// WithSince sets the Since option for the TailContainerLogs function.
func WithSince(since int64) Option {
return func(opts *logOptions) error {
opts.logOptions.Since = since
return nil
}
}
// WithProcessLogOptions sets the process log options for the TailContainerLogs function.
func WithProcessLogOptions(customOpts ...processlog.StdStreamLogArgsOption) Option {
return func(opts *logOptions) error {
opts.processOptions = customOpts
return nil
}
}
// WithCallback sets the callback function for the TailContainerLogs function.
func WithCallback(callback Callback) Option {
return func(opts *logOptions) error {
if callback == nil {
return newCallbackError("callback is not provided")
}
opts.callback = callback
return nil
}
}
// ValidateOptions validates the options for the TailContainerLogs function.
func ValidateOptions(opts ...Option) error {
logOpts := &logOptions{}
for _, opt := range opts {
if err := opt(logOpts); err != nil {
return optionError{err}
}
}
if logOpts.ctx == nil {
return optionError{newContextError("context is not provided")}
}
if logOpts.logOptions.Container == "" {
return optionError{newResourceError("resource is not provided")}
}
if logOpts.pool == nil {
return optionError{newPoolError("pool is not provided")}
}
return nil
}
type optionError struct {
err error
}
func (e optionError) Error() string {
return e.err.Error()
}
type contextError struct {
errMsg string
}
func newContextError(errMsg string) contextError {
return contextError{errMsg: errMsg}
}
func (e contextError) Error() string {
return e.errMsg
}
type resourceError struct {
errMsg string
}
func newResourceError(errMsg string) resourceError {
return resourceError{errMsg: errMsg}
}
func (e resourceError) Error() string {
return e.errMsg
}
type poolError struct {
errMsg string
}
func newPoolError(errMsg string) poolError {
return poolError{errMsg: errMsg}
}
func (e poolError) Error() string {
return e.errMsg
}
type callbackError struct {
errMsg string
}
func newCallbackError(errMsg string) callbackError {
return callbackError{errMsg: errMsg}
}
func (e callbackError) Error() string {
return e.errMsg
}