         - Parameter conversion: closure attempting to convert the input to the desired output
         - Throws: Input.PipeUserInputOverlapError if the user piped data and this method was called
     */
-    public class func awaitInputWithConversion<T>(message: String?, conversion: (_ input: String) -> T?) throws -> T {
-        let input = try awaitInputWithValidation(message: message) {(input) in
+    public static func awaitInputWithConversion<T>(message: String?, conversion: (_ input: String) -> T?) -> T {
+        let input = awaitInputWithValidation(message: message) { (input) in
             return conversion(input) != nil
         }
         

        - Parameter message: message to be printed before accepting input (e.g. "Name: ")
        - Throws: Input.PipeUserInputOverlapError if the user piped data and this method was called
    */
    public class func awaitInput(message: String?) throws -> String {
        if pipedData != nil {
            throw CLIError.error("Data should not be both piped and input")
        }
        
        if let message = message {
            print(message)
        }

        - Parameter validation: closure evaluating whether the given input was valid
        - Throws: Input.PipeUserInputOverlapError if the user piped data and this method was called
    */
    public static func awaitInputWithValidation(message: String?, validation: (_ input: String) -> Bool) -> String {
        while (true) {
            let str = awaitInput(message: message)
            
            if validation(str) {
                return str
