diff --git a/fields.go b/fields.go index 669540b..aa315c0 100644 --- a/fields.go +++ b/fields.go @@ -3,15 +3,16 @@ package form type FieldType string const ( - FieldTypeGroup FieldType = "group" - FieldTypeCheckbox FieldType = "checkbox" - FieldTypeChecklist FieldType = "checklist" - FieldTypeInput FieldType = "input" - FieldTypeLabel FieldType = "label" - FieldTypeRadios FieldType = "radios" - FieldTypeDropdown FieldType = "dropdown" - FieldTypeSubmit FieldType = "submit" - FieldTypeTextArea FieldType = "textArea" + FieldTypeGroup FieldType = "group" + FieldTypeCheckbox FieldType = "checkbox" + FieldTypeChecklist FieldType = "checklist" + FieldTypeInput FieldType = "input" + FieldTypeLabel FieldType = "label" + FieldTypeRadios FieldType = "radios" + FieldTypeDropdown FieldType = "dropdown" + FieldTypeDropdownMapped FieldType = "dropdownmapped" + FieldTypeSubmit FieldType = "submit" + FieldTypeTextArea FieldType = "textArea" ) type InputFieldType string diff --git a/transformer.go b/transformer.go index 3f58644..f55c542 100644 --- a/transformer.go +++ b/transformer.go @@ -9,10 +9,15 @@ import ( type ( Enumerator interface{ Enum() []any } + Mapper interface { + Mapper() map[string]string + String() string + } ) var ( - enumType = reflect.TypeOf((*Enumerator)(nil)).Elem() + enumType = reflect.TypeOf((*Enumerator)(nil)).Elem() + mapperType = reflect.TypeOf((*Mapper)(nil)).Elem() ) type Transformer struct { @@ -94,6 +99,24 @@ func (t *Transformer) scanModel(rValue reflect.Value, rType reflect.Type, names continue } + if rType.Field(i).Type.Implements(mapperType) { + maps := rValue.Field(i).Interface().(Mapper).Mapper() + var fieldValue []FieldValue + for k, v := range maps { + fieldValue = append(fieldValue, FieldValue{ + Value: k, + Name: v, + Disabled: false, + }) + } + + field.Type = FieldTypeDropdownMapped + field.Values = fieldValue + + fields = append(fields, field) + continue + } + inputType := InputFieldType(tags.Get("inputType")) fType := rType.Field(i).Type