Trilhas
/
F#
F#
/
Exercícios
/
Verificador de senha
Verificador de senha

Verificador de senha

Exercício de aprendizagem

Introdução

O tipo Result permite que uma função retorne um único valor que indica todas as coisas a seguir:

  • Se a operação teve sucesso ou falhou
  • Em caso de sucesso, o valor resultante da operação
  • Em caso de falha, o motivo da falha

Uso

O tipo Result é um tipo genérico que contém dois tipos subjacentes:

  • O tipo do valor resultante em uma operação bem-sucedida
  • O tipo de erro em uma falha

O tipo Result também é uma [união discriminada][discriminated-union] com os seguintes casos possíveis:

  • Ok <value> representando um resultado bem-sucedido
  • Error <reason> representando uma falha

A função a seguir demonstra como criar um valor Result:

let validateName (name: string) : Result<string, string> = 
    match name with
    | null -> Error "Name not found."
    | "" -> Error "Name is empty."
    | _ -> Ok name

Neste exemplo, o valor Ok é uma string (o nome fornecido), e o valor Error também é uma string (a causa do erro, em formato legível por humanos).

Lendo o conteúdo de um valor Result

Considere a seguinte definição de tipo e assinatura de função:

type FileOpenError = 
| NotFound
| AccessDenied
| FileLocked

let openFile (filename: string) : Result<int, FileOpenError> =

O código que chama a função openFile pode usar a correspondência de padrões para tratar os casos de sucesso e falha, como no exemplo a seguir:

match openFile(filename) with
| Ok handle -> doSomethingWithFile(handle)
| Error NotFound -> printfn $"Error: file {filename} was not found."
| Error AccessDenied -> printfn $"Error: you do not have permission to open the file {filename}."
| Error FileLocked -> printfn $"Error: file {filename} is already in use."

Instruções

Sua tarefa é criar um verificador de senha. Um verificador de senha valida a senha proposta por um usuário. Ele garante que ela atenda a um conjunto de requisitos definidos pela organização que controla o acesso ao recurso em questão.

Para este exercício, os requisitos da senha são:

  • Deve ter 12 caracteres ou mais
  • Deve ter pelo menos uma letra maiúscula
  • Deve ter pelo menos uma letra minúscula
  • Deve ter pelo menos um dígito
  • Deve ter pelo menos um símbolo do conjunto !@#$%^&*

Sua solução deve usar um Result para encapsular o status de sucesso ou de falha. No caso de sucesso, o Result deve transmitir a senha validada como string. No caso de falha, o Result deve transmitir a regra que foi violada.

Note

Para este exercício, o verificador de senha será simplista: ele vai indicar apenas quando uma única regra foi violada. Um exercício posterior vai explorar um verificador de senha mais realista, capaz de indicar quando várias regras foram violadas ao mesmo tempo.

1. Implemente a função checkPassword

A função checkPassword verifica a senha fornecida de acordo com as regras mencionadas acima. Em caso de falha, ela indica a regra que foi violada, encapsulando um dos valores de PasswordRule dentro do valor de resultado.

checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter

2. Implemente a função ``getStatusMessage`

A função getStatusMessage retorna uma string contendo uma mensagem legível por humanos que indica o significado do resultado retornado por checkPassword.

getStatusMessage (Error MissingDigit)
// => "Error: does not have at least one digit"
Editar via GitHub O link abre em uma nova janela ou aba
F# Exercism

Tudo pronto para começar Verificador de senha?

Crie sua conta no Exercism para aprender e dominar F# com 18 conceitos148 exercícios e mentoria humana de verdade, tudo de graça.