🚧 Scaffold stuff
This commit is contained in:
parent
21ffd33be7
commit
a73435601c
6 changed files with 212 additions and 0 deletions
25
.gitignore
vendored
Normal file
25
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# If you prefer the allow list template instead of the deny list, see community template:
|
||||
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
|
||||
#
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
# Dependency directories
|
||||
vendor/
|
||||
|
||||
# Go workspace file
|
||||
go.work
|
||||
go.work.sum
|
||||
|
||||
# env file
|
||||
.env
|
||||
|
||||
build/
|
||||
.task/
|
||||
39
.golangci.yaml
Normal file
39
.golangci.yaml
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
linters:
|
||||
enable:
|
||||
- errcheck
|
||||
- gosimple
|
||||
- govet
|
||||
- ineffassign
|
||||
- staticcheck
|
||||
- unused
|
||||
- copyloopvar
|
||||
- dupl
|
||||
- err113
|
||||
- errname
|
||||
- exptostd
|
||||
- fatcontext
|
||||
- funlen
|
||||
- gocognit
|
||||
- goconst
|
||||
- gocritic
|
||||
- gocyclo
|
||||
- godot
|
||||
- godox
|
||||
- gosec
|
||||
- perfsprint
|
||||
- testifylint
|
||||
|
||||
linters-settings:
|
||||
testifylint:
|
||||
enable-all: true
|
||||
disable:
|
||||
- require-error
|
||||
gocognit:
|
||||
min-complexity: 5
|
||||
gocyclo:
|
||||
min-complexity: 5
|
||||
gocritic:
|
||||
enable-all: true
|
||||
settings:
|
||||
hugeParam:
|
||||
sizeThreshold: 255
|
||||
62
Taskfile.yml
Normal file
62
Taskfile.yml
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
version: '3'
|
||||
|
||||
tasks:
|
||||
default:
|
||||
cmds:
|
||||
- task: fmt
|
||||
- task: test
|
||||
- task: lint
|
||||
|
||||
fmt:
|
||||
desc: Format go code
|
||||
sources:
|
||||
- '**/*.go'
|
||||
cmds:
|
||||
- go fmt ./...
|
||||
- go mod tidy
|
||||
|
||||
gen:
|
||||
desc: Generate files
|
||||
sources:
|
||||
- '**/*.go'
|
||||
cmds:
|
||||
- go generate ./...
|
||||
|
||||
lint:
|
||||
desc: Do static analysis
|
||||
sources:
|
||||
- '**/*.go'
|
||||
cmds:
|
||||
- golangci-lint run
|
||||
|
||||
test:
|
||||
desc: Run unit tests
|
||||
deps: [fmt]
|
||||
sources:
|
||||
- '**/*.go'
|
||||
generates:
|
||||
- build/cover.out
|
||||
cmds:
|
||||
- go test -race -cover -coverprofile build/cover.out ./...
|
||||
|
||||
coverage-report:
|
||||
desc: Build coverage report
|
||||
deps: [test]
|
||||
sources:
|
||||
- build/cover.out
|
||||
generates:
|
||||
- build/cover.html
|
||||
cmds:
|
||||
- go tool cover -html=build/cover.out -o build/cover.html
|
||||
|
||||
serve-report:
|
||||
desc: Serve the coverage report
|
||||
deps: [coverage-report]
|
||||
cmds:
|
||||
- ip addr list | grep inet
|
||||
- php -S 0.0.0.0:3434 -t build
|
||||
|
||||
serve-docs:
|
||||
desc: Serve the current docs
|
||||
cmds:
|
||||
- godoc -http=0.0.0.0:3434 -play
|
||||
31
cache.go
Normal file
31
cache.go
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
package ezcache
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"time"
|
||||
)
|
||||
|
||||
// ErrInvalidFetcher is returned by Cache.SetFetcher if the fetcher is invalid.
|
||||
// This is probably only going to happen if it's nil.
|
||||
var ErrInvalidFetcher = errors.New("invalid fetcher")
|
||||
|
||||
// ErrInvalidDuration is returned by Cache.SetExpiry if the duration is invalid.
|
||||
// This is usually if it is <= 0.
|
||||
var ErrInvalidDuration = errors.New("invalid duration")
|
||||
|
||||
type Fetcher[K comparable, V any] func(K) (V, error)
|
||||
|
||||
// Cache represents a Cache for values.
|
||||
type Cache[K comparable, V any] interface {
|
||||
// Get will fetch the value for key. If in the cache, it will fetch the cached value.
|
||||
// If not in the cache, it will use the Fetcher.
|
||||
// It may return [ErrInvalidFetcher], but if an error is returned, it's probably returned by the
|
||||
// [Fetcher] itself.
|
||||
Get(key K) (V, error)
|
||||
|
||||
// SetFetcher sets the fetcher for this [Cache].
|
||||
SetFetcher(f Fetcher[K, V]) error
|
||||
|
||||
// SetExpiry sets the expiry for this [Cache].
|
||||
SetExpiry(d time.Duration) error
|
||||
}
|
||||
52
ezcache.go
Normal file
52
ezcache.go
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
package ezcache
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"time"
|
||||
)
|
||||
|
||||
type ezc[K comparable, V any] struct {
|
||||
fetch Fetcher[K, V]
|
||||
exp time.Duration
|
||||
cache map[K]V
|
||||
setTime map[K]time.Time
|
||||
}
|
||||
|
||||
func New[K comparable, V any](fetcher Fetcher[K, V], exp time.Duration) (Cache[K, V], error) {
|
||||
c := &ezc[K, V]{}
|
||||
err := c.SetFetcher(fetcher)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = c.SetExpiry(exp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
c.cache = make(map[K]V)
|
||||
c.setTime = make(map[K]time.Time)
|
||||
return c, nil
|
||||
}
|
||||
|
||||
var errUnimpl = errors.New("unimplemented")
|
||||
|
||||
func (c *ezc[K, V]) Get(key K) (V, error) {
|
||||
var val V
|
||||
return val, errUnimpl
|
||||
}
|
||||
|
||||
func (c *ezc[K, V]) SetFetcher(f Fetcher[K, V]) error {
|
||||
if f == nil {
|
||||
return ErrInvalidFetcher
|
||||
}
|
||||
c.fetch = f
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *ezc[K, V]) SetExpiry(exp time.Duration) error {
|
||||
if exp <= 0 {
|
||||
return ErrInvalidDuration
|
||||
}
|
||||
c.exp = exp
|
||||
return nil
|
||||
}
|
||||
3
go.mod
Normal file
3
go.mod
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
module codeberg.org/danjones000/ezcache
|
||||
|
||||
go 1.23.7
|
||||
Loading…
Add table
Add a link
Reference in a new issue