1 | var readline = require('readline');
|
2 |
|
3 | var when = require('when');
|
4 |
|
5 | var solution = require('./solution');
|
6 | var attempt = require('./attempt');
|
7 |
|
8 | var successMessage = '{blue}{bold}Challenge Completed{/bold}{/blue}';
|
9 | var failureMessage = '{red}{bold}Try Again{/bold}{/red}';
|
10 |
|
11 | function question(text, expectedCmd, success){
|
12 | var rl = readline.createInterface({
|
13 | input: process.stdin,
|
14 | output: process.stdout
|
15 | });
|
16 |
|
17 | rl.on('SIGINT', function() {
|
18 | rl.question('Are you sure you want to exit (y/N)? ', function(answer) {
|
19 | if(answer.match(/^y(es)?$/i)){
|
20 | rl.close();
|
21 | } else {
|
22 | console.log(text);
|
23 | rl.prompt();
|
24 | }
|
25 | });
|
26 | });
|
27 |
|
28 | var defer = when.defer();
|
29 |
|
30 | var expected = when.resolve();
|
31 | if(typeof expectedCmd === 'string'){
|
32 | expected = solution(expectedCmd);
|
33 | } else {
|
34 | success = expectedCmd;
|
35 | }
|
36 |
|
37 | success = success || function(data){
|
38 | return data[0] === data[1];
|
39 | };
|
40 |
|
41 | console.log(text);
|
42 | rl.prompt();
|
43 | rl.once('line', function(cmd){
|
44 | rl.close();
|
45 | when.join(attempt(cmd), expected)
|
46 | .then(success)
|
47 | .then(function(passed){
|
48 | if(passed){
|
49 | console.log(successMessage);
|
50 | defer.resolve();
|
51 | } else {
|
52 | console.log(failureMessage);
|
53 | when(question(text, expectedCmd, success), defer.resolve);
|
54 | }
|
55 | }, console.error.bind(console));
|
56 | });
|
57 |
|
58 | return defer.promise;
|
59 | }
|
60 |
|
61 | module.exports = question;
|