🚧 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