package query import "time" const ( defaultPage = 1 defaultPageSize = 10 defaultIncludeDeleted = false defaultWithCacheWrite = false defaultCacheTTL = 5 * time.Minute defaultNotFoundCacheTTL = 1 * time.Minute ) type Option struct { Page int PageSize int IncludeDeleted bool WithCacheWrite bool CacheTTL time.Duration NotFoundCacheTTL time.Duration } type OptionFunc func(*Option) func NewOption(opts ...OptionFunc) *Option { queryOpntion := &Option{ Page: defaultPage, PageSize: defaultPageSize, IncludeDeleted: defaultIncludeDeleted, WithCacheWrite: defaultWithCacheWrite, CacheTTL: defaultCacheTTL, NotFoundCacheTTL: defaultNotFoundCacheTTL, } for _, opt := range opts { opt(queryOpntion) } return queryOpntion } func WithPage(page int) OptionFunc { return func(o *Option) { if page > 0 { o.Page = page } } } func WithPageSize(pageSize int) OptionFunc { return func(o *Option) { if pageSize > 0 { o.PageSize = pageSize } } } func WithIncludeDeleted(includeDeleted bool) OptionFunc { return func(o *Option) { o.IncludeDeleted = includeDeleted } } func WithCacheWrite(withCacheWrite bool) OptionFunc { return func(o *Option) { o.WithCacheWrite = withCacheWrite } } func WithCacheTTL(cacheTTL time.Duration) OptionFunc { return func(o *Option) { if cacheTTL >= 0 { o.CacheTTL = cacheTTL } } } func WithNotFoundCacheTTL(notFoundCacheTTL time.Duration) OptionFunc { return func(o *Option) { if notFoundCacheTTL >= 0 { o.NotFoundCacheTTL = notFoundCacheTTL } } }