Validação

Ao construir plug-ins robustos, é importante garantir que as funções tratem erros normalmente e funcionem conforme o esperado, mesmo em casos de uso indevido ou entradas inesperadas. A validação ajuda a proteger a integridade da função e evitar falhas ou comportamento não intencional.

Vejamos como podemos melhorar a função send-message adicionando verificações de validação para garantir que ela lide com as entradas corretamente.

Validar entradas

Antes de enviar uma mensagem, devemos garantir que o argumento output passado para a função send-message é válido. Podemos adicionar uma verificação para confirmar se o destino de saída é um dos valores esperados (gui, consola de erros ou terminal).

Exemplo:

(define (send-message message output)
 ;; Valida o argumento de saída
 (if (not (member output '(gui error-console terminal)))
 (error "Invalid output destination: " output)
 (cond
 ;; Enviar para a consola de mensagens
 ((eq? output 'error-console)
 (lumi-message-set-handler 2)
 (lumi-message message))

 ;; Enviar para a caixa de diálogo GUI
 ((eq? output 'gui)
 (lumi-message-set-handler 0)
 (lumi-message message))

 ;; Enviar para a janela do terminal
 ((eq? output 'terminal)
 (display message))))

 ;; Restaurar o manipulador de mensagens padrão para a consola de mensagens
 (lumi-message-set-handler 2))

Neste exemplo, usamos member para verificar se o argumento output é válido. Caso contrário, a função gera um erro com uma mensagem clara, evitando que valores inválidos causem problemas.

Lidar com mensagens vazias

Também é útil garantir que o argumento message seja válido. Por exemplo, se uma string vazia ou #f (falso) for passada como mensagem, a função deverá lidar com isso normalmente.

Exemplo de tratamento de uma mensagem vazia:

(define (send-message message output)
 ;; Verificar se a mensagem está vazia
 (if (or (not message) (string=? message ""))
 (error "Message cannot be empty")
 (cond
 ((eq? output 'error-console)
 (lumi-message-set-handler 2)
 (lumi-message message))
 ((eq? output 'gui)
 (lumi-message-set-handler 0)
 (lumi-message message))
 ((eq? output 'terminal)
 (display message))))

 (lumi-message-set-handler 2))

Essa abordagem garante que a função sempre receba entradas válidas, melhorando a respetiva fiabilidade e evitando comportamentos inesperados.

Exemplo de validação combinada

;; Função para tratar a saída de mensagens para vários destinos
(define (send-message message output)

 ;; Validar os argumentos da mensagem e da saída
 (if (or (not (string? message)) (string=? message ""))
 (error "Message must be a non-empty string")
 (if (not (member output '(gui error-console terminal)))
 (error "Invalid output destination: " output)
 (cond
 ;; Enviar para a consola de mensagens
 ((eq? output 'error-console)
 (lumi-message-set-handler 2)
 (lumi-message message))

 ;; Enviar para a caixa de diálogo GUI
 ((eq? output 'gui)
 (lumi-message-set-handler 0)
 (lumi-message message))

 ;; Enviar para a janela do terminal
 ((eq? output 'terminal)
 (display message)))))

 ;; Restaurar o manipulador de mensagens padrão para a consola de mensagens
 (lumi-message-set-handler 2))

Nesta versão:

  • A função verifica primeiro se message está vazio ou inválido. Se a mensagem for válida, passa a verificar se output é um dos valores aceitos (gui, error-console ou terminal).
  • Se ambas as verificações forem aprovadas, a mensagem será enviada para a saída apropriada. Caso contrário, uma mensagem de erro será gerada com uma explicação clara.
  • Uma verificação adicional é feita para garantir que a mensagem também seja uma string.

Esta função de validação combinada mantém o código mais limpo e garante que ambas as entradas sejam validadas antes de qualquer ação ser tomada, tornando a função mais robusta. Observe que também estamos construindo um sistema de mensagens de depuração. Quando o código falha, obtém-se uma mensagem de erro clara.

Execution error for 'Hello loaded!':
Error: Message must be a non-empty string
Execution error for 'Hello loaded!':
Error: Invalid output destination: gu