У меня есть форма, в которой пользователь может либо выбрать из существующего списка значений, либо создать новое (текстовое) значение.
Каким будет самый элегантный способ кодирования этого?
Мой лучший (и IMO не очень элегантный) способ сделать это - определить:
data MyInput = MyInput {createNew :: Bool, newVal :: Maybe Text, existingVal :: Maybe Text}
myForm :: [(Text,Text)] -> Html -> MForm MySite MySite (FormResult MyInput,Widget)
myForm exisingVals = renderTable $ MyInput
<$> areq boolField "Create new" (Just False)
<*> aopt textField "New val" Nothing
<*> aopt (selectField existingVals) "Existing values" Nothing
И как только форма будет получена, передайте результат через что-то вроде:
getMyValue :: MyInput -> Either ErrorMsg Text
getMyValue i = if createNew i
then if newVal i == Nothing || existingVal i /= Nothing
then Left "Missing new value or illegal input"
else Right . fromJust . newVal $ i
else if existingVal i == Nothing || newVal i /= Nothing
then Left "Missing selection or illegal input"
else Right . fromJust . existingVal $ i
И обработчик должен решить, следует ли повторно отправить форму или действовать в соответствии с результатом.
Какие-нибудь более качественные / короткие предложения?Моя настоящая форма имеет два таких поля выбора / создания, что делает структуру данных и обработку еще более утомительным.Спасибо,