Percursos
/
F#
F#
/
Exercícios
/
Verificador de palavras-passe
Verificador de palavras-passe

Verificador de palavras-passe

Exercício de aprendizagem

Introdução

O tipo Result permite que uma função devolva um único valor que indica tudo o seguinte:

  • Se a operação foi bem-sucedida ou falhou
  • Em caso de sucesso, o valor resultante da operação
  • Em caso de falha, o motivo da falha

Utilização

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

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

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

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

A seguinte função demonstra como criar um valor do tipo 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 para humanos).

Ler o conteúdo de um valor do tipo Result

Considera 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 correspondência de padrões para tratar os casos de sucesso e de falha, como no exemplo seguinte:

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

A tua tarefa é criar um verificador de palavras-passe. Um verificador de palavras-passe valida a palavra-passe proposta por um utilizador para garantir que cumpre um conjunto de requisitos definidos pela organização que controla o acesso ao recurso em questão.

Para este exercício, os requisitos da palavra-passe são:

  • Tem de ter 12 ou mais carateres
  • Tem de ter pelo menos uma letra maiúscula
  • Tem de ter pelo menos uma letra minúscula
  • Tem de ter pelo menos um algarismo
  • Tem de ter pelo menos um símbolo do conjunto !@#$%^&*

A tua solução tem de usar um Result para encapsular o estado de sucesso ou de falha. No caso de sucesso, o Result deve conter a palavra-passe validada como uma string. No caso de falha, o Result deve conter a regra que foi violada.

Note

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

1. Implementa a função checkPassword

A função checkPassword verifica a palavra-passe fornecida em relação às regras acima mencionadas. Em caso de falha, indica a regra que foi violada, encapsulando um dos valores de PasswordRule dentro do valor do resultado.

checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter

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

A função getStatusMessage devolve uma string com uma mensagem legível por humanos que indica o significado do resultado devolvido por checkPassword.

getStatusMessage (Error MissingDigit)
// => "Error: does not have at least one digit"
Editar via GitHub A ligação abre numa nova janela ou separador
F# Exercism

Estás pronto para começar Verificador de palavras-passe?

Inscreve-te no Exercism para aprenderes e dominares F# com 18 conceitos148 exercícios, e mentoria humana real, tudo grátis.