Boletín

Boletín

Ejercicio de aprendizaje

Introducción

Fichero

El módulo File proporciona las funciones para trabajar con ficheros.

Para leer un fichero completo, usa File.read/1. Para escribir en un fichero, usa File.write/2.

Cada vez que se escribe en un fichero con File.write/2, se abre un descriptor de fichero y se lanza un nuevo proceso de Elixir. Por este motivo, conviene evitar escribir en un fichero dentro de un bucle con File.write/2.

En su lugar, puedes abrir un fichero con File.open/2. El segundo argumento de File.open/2 es una lista de modos, que te permite especificar si quieres abrir el fichero para leer o para escribir.

File.open/2 devuelve el PID de un proceso que se encarga del fichero. Para leer y escribir en el fichero, usa funciones del módulo IO y pasa este PID como dispositivo de E/S.

Cuando termines de trabajar con el fichero, ciérralo con File.close/1.

Todas las funciones mencionadas del módulo File también tienen una variante con ! que lanza un error en lugar de devolver una tupla de error (por ejemplo, File.read!/1). Usa esa variante si no tienes intención de gestionar errores como ficheros que faltan o falta de permisos.

Instrucciones

Eres un gran aficionado a los trenes en miniatura y has decidido compartir tu pasión con el mundo creando un boletín. Empezarás enviando el primer número de tu boletín a tus amigos y conocidos que comparten tu afición. Tienes un archivo de texto con un array de sus direcciones de correo electrónico.

1. Leer direcciones de correo electrónico de un archivo

Implementa la función Newsletter.read_emails/1. Debe recibir la ruta de un archivo. El archivo es un archivo de texto que contiene direcciones de correo electrónico separadas por saltos de línea. La función debe devolver un array con las direcciones de correo electrónico del archivo.

Newsletter.read_emails("/home/my_user/documents/model_train_friends_emails.txt")
# => ["rick@example.com", "choochoo42@example.com", "anna@example.com"]

2. Abrir un archivo de registro para escritura

Enviar un correo electrónico es una tarea que puede fallar por muchas razones impredecibles, como un error tipográfico en la dirección de correo electrónico o problemas temporales de red. Para asegurarte de que puedes reintentar el envío de los correos electrónicos a todos tus amigos sin enviar duplicados, necesitas registrar las direcciones de correo electrónico que ya recibieron el correo. Para ello, necesitarás un archivo de registro.

Implementa la función Newsletter.open_log/1. Debe recibir la ruta de un archivo, abrir el archivo para escritura y devolver el PID del proceso que gestiona el archivo.

Newsletter.open_log("/home/my_user/documents/newsletter_issue1_log.txt")
# => #PID<0.145.0>

3. Registrar un correo electrónico enviado

Implementa la función Newsletter.log_sent_email/2. Debe recibir el PID del proceso que gestiona el archivo y un string con la dirección de correo electrónico. Debe escribir la dirección de correo electrónico en el archivo, seguida de un salto de línea.

Newsletter.log_sent_email(pid, "joe@example.com")
# => :ok

4. Cerrar el archivo de registro

Implementa la función Newsletter.close_log/1. Debe recibir el PID del proceso que gestiona el archivo y cerrar el archivo.

Newsletter.close_log(pid)
# => :ok

5. Enviar el boletín

Ahora que tienes todas las piezas del proceso de envío de correos electrónicos, necesitas combinarlas en una única función.

Implementa la función Newsletter.send_newsletter/3. Debe recibir la ruta del archivo con las direcciones de correo electrónico, la ruta de un archivo de registro y una función anónima que envía un correo electrónico a una dirección de correo electrónico dada. Debe leer todas las direcciones de correo electrónico del archivo dado e intentar enviar un correo electrónico a cada una de ellas. Si la función anónima que envía el correo electrónico devuelve :ok, escribe la dirección de correo electrónico en el archivo de registro, seguida de un salto de línea. Asegúrate de hacerlo en cuanto se envíe el correo electrónico. Cuando termines de enviar todo, cierra el archivo de registro.

Newsletter.send_newsletter(
  "model_train_friends_emails.txt",
  "newsletter_issue1_log.txt",
  fn email -> :ok end
)

# => :ok
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Elixir Exercism

¿Listo para empezar Boletín?

Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.