// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserved. // module-register.go package expr import ( "fmt" "path/filepath" ) type module struct { importFunc func(ExprContext) description string imported bool } func newModule(importFunc func(ExprContext), description string) *module { return &module{importFunc, description, false} } var moduleRegister map[string]*module func registerImport(name string, importFunc func(ExprContext), description string) { if moduleRegister == nil { moduleRegister = make(map[string]*module) } if _, exists := moduleRegister[name]; exists { panic(fmt.Errorf("module %q already registered", name)) } moduleRegister[name] = newModule(importFunc, description) } func ImportInContext(ctx ExprContext, name string) (exists bool) { var mod *module if mod, exists = moduleRegister[name]; exists { mod.importFunc(ctx) mod.imported = true } return } func ImportInContextByGlobPattern(ctx ExprContext, pattern string) (count int, err error) { var matched bool for name, mod := range moduleRegister { if matched, err = filepath.Match(pattern, name); err == nil { if matched { count++ mod.importFunc(ctx) mod.imported = true } } else { break } } return } func IterateModules(op func(name, description string, imported bool) bool) { if op != nil { for name, mod := range moduleRegister { if !op(name, mod.description, mod.imported) { break } } } } // ---- func init() { if moduleRegister == nil { moduleRegister = make(map[string]*module) } }