goext/README.md
Mike Schwörer 361dca5c85
All checks were successful
Build Docker and Deploy / Run goext test-suite (push) Successful in 2m56s
v0.0.521 ctxext
2024-10-05 01:06:36 +02:00

7.2 KiB

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="gogs.mikescher.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)