package persist import ( "fmt" "context" "reflect" "go.mongodb.org/mongo-driver/v2/bson" "git.gsuntres.com/general/mongo" ) func BuildFind(col map[string]any) { name := col["_name"].(string) plural := col["plural"].(string) // prepare input arguments and return results in := []reflect.Type{ reflect.TypeOf((*context.Context)(nil)).Elem(), reflect.TypeOf((*map[string]any)(nil)).Elem(), reflect.TypeOf((*int64)(nil)).Elem(), } out := []reflect.Type{ reflect.TypeOf(bson.M{}), reflect.TypeOf((*error)(nil)).Elem(), } // create function signature variadic := false funcType := reflect.FuncOf(in, out, variadic) funcName := fmt.Sprintf("%s%s", "Find", caseString.String(plural)) fields = append(fields, reflect.StructField{ Name: funcName, Type: funcType, }) isSystem := false if v, ok := col["system"]; ok { isSystem = v.(bool) } mc := mongo.GetMongoClient() // we defer function's implementation until we create the actual struct deferedFuncs[funcName] = func(ctx context.Context, filter map[string]any, limit int64) (bson.M, error) { db := "__undefined__" if isSystem { db = sysDb } else { account := ctx.Value("account").(string) if account != "" { db = mc.GetName(account) } } return mc.Find(ctx, db, name, filter, limit) } }