| 143 | } |
| 144 | |
| 145 | func tryToSetValue(value reflect.Value, field reflect.StructField, setter setter, tag string) (bool, error) { |
| 146 | var tagValue string |
| 147 | var setOpt setOptions |
| 148 | |
| 149 | tagValue = field.Tag.Get(tag) |
| 150 | tagValue, opts := head(tagValue, ",") |
| 151 | |
| 152 | if tagValue == "" { // default value is FieldName |
| 153 | tagValue = field.Name |
| 154 | } |
| 155 | if tagValue == "" { // when field is "emptyField" variable |
| 156 | return false, nil |
| 157 | } |
| 158 | |
| 159 | var opt string |
| 160 | for len(opts) > 0 { |
| 161 | opt, opts = head(opts, ",") |
| 162 | |
| 163 | if k, v := head(opt, "="); k == "default" { |
| 164 | setOpt.isDefaultExists = true |
| 165 | setOpt.defaultValue = v |
| 166 | |
| 167 | // convert semicolon-separated default values to csv-separated values for processing in setByForm |
| 168 | if field.Type.Kind() == reflect.Slice || field.Type.Kind() == reflect.Array { |
| 169 | cfTag := field.Tag.Get("collection_format") |
| 170 | if cfTag == "" || cfTag == "multi" || cfTag == "csv" { |
| 171 | setOpt.defaultValue = strings.ReplaceAll(v, ";", ",") |
| 172 | } |
| 173 | } |
| 174 | } else if k, v = head(opt, "="); k == "parser" { |
| 175 | setOpt.parser = v |
| 176 | } |
| 177 | } |
| 178 | |
| 179 | return setter.TrySet(value, field, tagValue, setOpt) |
| 180 | } |
| 181 | |
| 182 | // BindUnmarshaler is the interface used to wrap the UnmarshalParam method. |
| 183 | type BindUnmarshaler interface { |