package budget2 import "zhiyuan/pkg/db" type Control struct { Name string `json:"n"` Type string `json:"t"` Value interface{} `json:"v"` Param map[string]interface{} `json:"p"` } func (control *Control) PraseForMap(value map[string]interface{}) { control.Name = db.ToString(value["n"]) control.Type = db.ToString(value["t"]) control.Value = value["v"] if param, ok := value["p"].(map[string]interface{}); ok { control.Param = param } else { control.Param = make(map[string]interface{}) } } func (control *Control) ToMap() map[string]interface{} { return map[string]interface{}{ "n": control.Name, "t": control.Type, "v": control.Value, "p": control.Param, } } func (control *Control) Handle(typ string, value interface{}, context *Context) interface{} { switch control.Type { case "group", "popover": if v, ok := value.(map[string]interface{}); ok { index, _ := db.ToInt64(v["index"]) value := v["value"] controls := make([]interface{}, 0) values := control.Value if s, ok := control.Param["controls"].([]interface{}); ok { controls = s } if _, ok := values.([]interface{}); !ok { values = make([]interface{}, len(controls)) } if result, ok := values.([]interface{}); ok { if len(result) < len(controls) { values = append(result, make([]interface{}, len(controls)-len(result))) } } if index < int64(len(controls)) { var control Control if c, ok := controls[index].(Control); ok { control = c } else if c, ok := controls[index].(*Control); ok { control = *c } else if c, ok := controls[index].(map[string]interface{}); ok { control.PraseForMap(c) } if result, ok := values.([]interface{}); ok { result[index] = control.Handle(typ, value, context) return result } } } case "text": return control.Value default: switch typ { case "input": return value } } return control.Value } func ControlGroup(name string, controls []Control) Control { values := make([]interface{}, 0) for _, control := range controls { values = append(values, control.Value) } return Control{ Name: name, Type: "group", Value: values, Param: map[string]interface{}{ "controls": controls, }, } }