Um formulário reativo
Cada campo um sinal, cada erro um derivado, e o botão que só habilita quando tudo está certo.
Um formulário é o caso de uso que o modelo reativo resolve melhor: a regra de cada campo é uma fórmula sobre o valor dele, e "pode enviar?" é uma fórmula sobre os erros. Nada é recalculado à mão, e nenhum campo esquece de revalidar.
dataforge
adopt Arcane.Reativo as R
email := R.sinal("")
senha := R.sinal("")
confirma := R.sinal("")
erro_email := R.derivado(lambda => (void given email.ler().contains("@") otherwise "e-mail inválido"))
erro_senha := R.derivado(lambda => (void given len(senha.ler()) bigger_eq 8 otherwise "mínimo 8 caracteres"))
erro_confirma := R.derivado(lambda => (void given confirma.ler() is senha.ler() otherwise "as senhas diferem"))
pode_enviar := R.derivado(lambda => [erro_email.ler(), erro_senha.ler(), erro_confirma.ler()] is [void, void, void])
assert not pode_enviar.ler()
email.escrever("ana@exemplo.br")
senha.escrever("segredo-longo")
assert erro_confirma.ler() is "as senhas diferem"
confirma.escrever("segredo-longo")
assert pode_enviar.ler()
senha.escrever("curta") // mudar a senha revalida a confirmação
assert erro_confirma.ler() is "as senhas diferem" and not pode_enviar.ler()Na Vitrine, o mesmo raciocínio vale campo a campo: ver Estado e cache.