BFB goext library
A collection of general & useful library methods
This should not have any heavy dependencies (gin, mongo, etc) and add missing basic language features...
Potentially needs export GOPRIVATE="git.blackforestbytes.com"
Packages:
| Name |
Maintainer |
Description |
| langext |
Mike |
General uttility/helper functions, (everything thats missing from go standard library) |
| mathext |
Mike |
Utility/Helper functions for math |
| cryptext |
Mike |
Utility/Helper functions for encryption |
| syncext |
Mike |
Utility/Helper funtions for multi-threading / mutex / channels |
| dataext |
Mike |
Various useful data structures |
| zipext |
Mike |
Utility for zip/gzip/tar etc |
| reflectext |
Mike |
Utility for golang reflection |
| fsext |
Mike |
Utility for filesytem access |
| ctxext |
Mike |
Utility for context.Context |
|
|
|
| mongoext |
Mike |
Utility/Helper functions for mongodb (kinda abandoned) |
| cursortoken |
Mike |
MongoDB cursortoken implementation |
| pagination |
Mike |
Pagination implementation |
|
|
|
| totpext |
Mike |
Implementation of TOTP (2-Factor-Auth) |
| termext |
Mike |
Utilities for terminals (mostly color output) |
| confext |
Mike |
Parses environment configuration into structs |
| cmdext |
Mike |
Runner for external commands/processes |
|
|
|
| sq |
Mike |
Utility functions for sql based databases (primarily sqlite) |
| tst |
Mike |
Utility functions for unit tests |
|
|
|
| rfctime |
Mike |
Classes for time seriallization, with different marshallign method for mongo and json |
| gojson |
Mike |
Same interface for marshalling/unmarshalling as go/json, except with proper serialization of null arrays/maps |
|
|
|
| bfcodegen |
Mike |
Various codegen tools (run via go generate) |
|
|
|
| rext |
Mike |
Regex Wrapper, wraps regexp with a better interface |
| wmo |
Mike |
Mongo Wrapper, wraps mongodb with a better interface |
|
|
|
| scn |
Mike |
SimpleCloudNotifier |
|
|
|
Usage:
exerr
- see mongoext/builder.go for full info
Short summary:
- An better error package with metadata, listener, api-output and error-traces
- Initialize with
exerr.Init()
- Never return
err direct, always use exerr.Wrap(err, "...") - add metadata where applicable
- at the end either Print(), Fatal() or Output() your error (print = stdout, fatal = panic, output = json API response)
- You can add listeners with exerr.RegisterListener(), and save the full errors to a db or smth
wmo
- A typed wrapper around the official mongo-go-driver
- Use
wmo.W[...](...) to wrap the collections and type-ify them
- The new collections have all the usual methods, but types
- Also they have List() and Paginate() methods for paginated listings (witehr with a cursortoken or page/limit)
- Register additional hooks with
WithDecodeFunc, WithUnmarshalHook, WithMarshalHook, WithModifyingPipeline, WithModifyingPipelineFunc
- List(), Paginate(), etc support filter interfaces
- Rule(s) of thumb:
- filter the results in the filter interface
- sort the results in the sort function of the filter interface
- add joins ($lookup's) in the
WithModifyingPipelineFunc/WithModifyingPipeline
ginext
- A wrapper around gin-gonic/gin
- create the gin engine with
ginext.NewEngine
- Add routes with
engine.Routes()...
.Use(..) adds a middleware
.Group(..) adds a group
.Get().Handle(..) adds a handler
- Handler return values (in contract to ginext) - values implement the
ginext.HTTPResponse interface
- Every handler starts with something like:
func (handler Handler) CommunityMetricsValues(pctx ginext.PreContext) ginext.HTTPResponse {
type communityURI struct {
Version string `uri:"version"`
CommunityID models.CommunityID `uri:"cid"`
}
type body struct {
UserID models.UserID `json:"userID"`
EventID models.EventID `json:"eventID"`
}
var u uri
var b body
ctx, gctx, httpErr := pctx.URI(&u).Body(&b).Start() // can have more unmarshaller, like header, form, etc
if httpErr != nil {
return *httpErr
}
defer ctx.Cancel()
// do stuff
}
sq
- TODO (like mongoext for sqlite/sql databases)