Reads a string map into a struct
(dest interface{}, strMap map[string]string, v *StructValidation)
| 789 | |
| 790 | // Reads a string map into a struct |
| 791 | func StructFromStringMap(dest interface{}, strMap map[string]string, v *StructValidation) []error { |
| 792 | allowedFields := []string{} |
| 793 | allErrs := []error{} |
| 794 | var ok bool |
| 795 | |
| 796 | if strMap == nil { |
| 797 | if v.TreatNullAsEmpty { |
| 798 | strMap = make(map[string]string, 0) |
| 799 | } else { |
| 800 | if !v.AllowExplicitNull { |
| 801 | return []error{ErrorCannotBeEmptyOrNull(v.Required)} |
| 802 | } |
| 803 | return nil |
| 804 | } |
| 805 | } |
| 806 | |
| 807 | for _, structFieldValidation := range v.StructFieldValidations { |
| 808 | key := inferKey(reflect.TypeOf(dest), structFieldValidation.StructField, structFieldValidation.Key) |
| 809 | allowedFields = append(allowedFields, key) |
| 810 | |
| 811 | if structFieldValidation.Nil == true { |
| 812 | continue |
| 813 | } |
| 814 | |
| 815 | strMapVal, keyExists := strMap[key] |
| 816 | |
| 817 | var err error |
| 818 | var errs []error |
| 819 | var val interface{} |
| 820 | |
| 821 | if structFieldValidation.StringValidation != nil { |
| 822 | validation := *structFieldValidation.StringValidation |
| 823 | updateValidation(&validation, dest, structFieldValidation) |
| 824 | if keyExists { |
| 825 | val, err = StringFromStr(strMapVal, &validation) |
| 826 | } else { |
| 827 | val, err = ValidateStringMissing(&validation) |
| 828 | } |
| 829 | if err == nil && structFieldValidation.Parser != nil { |
| 830 | val, err = structFieldValidation.Parser(val.(string)) |
| 831 | } |
| 832 | } else if structFieldValidation.StringPtrValidation != nil { |
| 833 | validation := *structFieldValidation.StringPtrValidation |
| 834 | updateValidation(&validation, dest, structFieldValidation) |
| 835 | if keyExists { |
| 836 | val, err = StringPtrFromStr(strMapVal, &validation) |
| 837 | } else { |
| 838 | val, err = ValidateStringPtrMissing(&validation) |
| 839 | } |
| 840 | if err == nil && structFieldValidation.Parser != nil { |
| 841 | if val.(*string) == nil { |
| 842 | val = nil |
| 843 | } else { |
| 844 | val, err = structFieldValidation.Parser(*val.(*string)) |
| 845 | if err == nil && val != nil { |
| 846 | valValue := reflect.ValueOf(val) |
| 847 | valPtrValue := reflect.New(valValue.Type()) |
| 848 | valPtrValue.Elem().Set(valValue) |
no test coverage detected