package mongo // import "runtime" import "log" type Query struct { Filter map[string]any } type Filter struct { Name string Op string Value string } func makeFilter(name string, value any) *Filter { log.Printf("type is %T", value) var op string var v string switch value.(type) { case string: op = "eq" v = value.(string) case map[string]any: vMap := value.(map[string]any) for kk, vv := range vMap { op = kk v = vv.(string) break } default: op = "eq" } o := &Filter{ Name: name, Op: op, Value: v, } return o } func Mongofy(q *Query) map[string]any { conditions := make([]map[string]interface{}, 0) logic := "and" // runtime.Breakpoint() for k, v := range q.Filter { if k == "_logic" { logic = v.(string) continue } f := makeFilter(k, v) log.Printf("=> filter: %#v", f) mongoOp := mapToOp(f.Op) conditions = append(conditions, map[string]any{ k: map[string]any{ mongoOp: f.Value }}) } if logic == "or" { return map[string]any{ "$or": conditions, } } // if filter == nil { // return filter // } return map[string]any{ "$and": conditions, } } func mapToOp(v string) string { switch v { case "eq": return "$eq" case "includes": return "$regex" default: log.Printf("WARN: no conversion") return v } }