package common import ( "io" "path/filepath" "strings" "go.uber.org/zap" ) type DecoderParams struct { Reader io.ReadSeeker // required Extension string // required, source extension, eg. ".mp3" FilePath string // optional, source file path Logger *zap.Logger // required } type NewDecoderFunc func(p *DecoderParams) Decoder type decoderItem struct { noop bool decoder NewDecoderFunc } var DecoderRegistry = make(map[string][]decoderItem) func RegisterDecoder(ext string, noop bool, dispatchFunc NewDecoderFunc) { DecoderRegistry[ext] = append(DecoderRegistry[ext], decoderItem{noop: noop, decoder: dispatchFunc}) } func GetDecoder(filename string, skipNoop bool) (rs []NewDecoderFunc) { ext := strings.ToLower(strings.TrimLeft(filepath.Ext(filename), ".")) for _, dec := range DecoderRegistry[ext] { if skipNoop && dec.noop { continue } rs = append(rs, dec.decoder) } return }