App 2: Read User Input

To read input from a user, we use the readLine function that’s in the scala.io.StdIn data type. Again — imagining that we’re reading input in a REST service — we know that we want to return a Try:

def readInput(): Try

Because readLine returns a String, the function returns a Try[String], and the complete function looks like this:

def readInput(): Try[String] = Try {
    StdIn.readLine()
}

Now I add this function to the IOHelper object:

import scala.io.StdIn
import scala.util.{Try, Success, Failure}

object IOHelper:

    def promptUser(): Try[Unit] = Try {
        println("\n(Commands: a \"task\", d 1, u 1, h, q, v)")
        print("Yo: ")
    }

    def readInput(): Try[String] = Try {
        StdIn.readLine()
    }

end IOHelper

At this point, if all I was going to do was prompt the user one time and then read their input, I could add readInput to my main method, like this:

import IOHelper.*

@main def ToDoList() = 
    val db = Database("./ToDoList.dat")
    promptUser()
    val input: Try[String] = readInput()

After that I would handle the input value, most likely in a match expression.

However, this is not what I want. What I really want is to keep prompting the user inside some sort of loop. But first, let’s write one more I/O function while we’re in this neighborhood.