package models import "reflect" type FieldMapper interface { GetFields() interface{} } func (c *CreatingDealReq) GetFields() interface{} { return c.Fields } func (c *CompanyReq) GetFields() interface{} { return c.Fields } func (c *CreateContactReq) GetFields() interface{} { return c.Fields } func (c *CreatingLeadReq) GetFields() interface{} { return c.Fields } func FormattingToMap(f FieldMapper, fieldAnswer map[string]string) map[string]map[string]interface{} { resultFields := make(map[string]interface{}) result := make(map[string]map[string]interface{}) fields := reflect.ValueOf(f.GetFields()) fieldType := reflect.TypeOf(f.GetFields()) for i := 0; i < fields.NumField(); i++ { field := fields.Field(i) fieldName := fieldType.Field(i).Tag.Get("json") switch field.Kind() { case reflect.String: resultFields[fieldName] = field.String() case reflect.Int32, reflect.Int: resultFields[fieldName] = field.Int() case reflect.Slice: if field.Type().Elem().Kind() == reflect.Int32 { resultFields[fieldName] = field.Interface().([]int32) } } } for key, value := range fieldAnswer { resultFields[key] = value } result["fields"] = resultFields return result }