From 4a81f148b476907cf18e949faebc77677ca181ce Mon Sep 17 00:00:00 2001 From: PhilKunz Date: Sun, 20 Nov 2016 22:24:09 +0100 Subject: [PATCH] implement AnswerBucket --- README.md | 19 +++- dist/smartinteract.classes.smartinteract.d.ts | 33 ++++++- dist/smartinteract.classes.smartinteract.js | 82 +++++++++++++--- test/test.js | 25 ++++- test/test.ts | 27 ++++- ts/smartinteract.classes.smartinteract.ts | 98 ++++++++++++++----- 6 files changed, 237 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 8a358b9..56721e5 100644 --- a/README.md +++ b/README.md @@ -24,18 +24,33 @@ We recommend the use of TypeScript for best in class intellesense import { SmartInteract } from 'smartinteract' let myInteract = new SmartInteract([{ // note: its an array. You can specify multiple questions + name: 'question1', type: 'input', message: 'Who are you?', default: 'Somebody', - choices: { ... }, // optional, only needed if type is 'choice' validate: (inputString) => { return true } // implement your own validation }]) SmartInteract.addQuestions([ ... ]) // add more questions SmartInteract.runQueue() - .then(answersArray => { + .then(answerBucket => { // the bucket has all the answers of the completed queue + let answerQuestion1 = answerBucket.getAnswerFor('question1') // do something with the answers }) +// alternatively use .askQuestion() for more direct control +SmartInteract.askQuestion{ // note: its an array. You can specify multiple questions + name: 'question2', + type: 'confirm', + message: 'Do you speak English?', + default: true, + validate: (inputString) => { return true } // implement your own validation +}().then(answerObject => { + // answerObject looks like { name: 'question2', value: true } +}) ``` +### Environment +In some environments like CI there is no user input to be expected. +smartinteract will always directyl create an answer from the default value + [![npm](https://push.rocks/assets/repo-header.svg)](https://push.rocks) diff --git a/dist/smartinteract.classes.smartinteract.d.ts b/dist/smartinteract.classes.smartinteract.d.ts index d447a9e..51175cb 100644 --- a/dist/smartinteract.classes.smartinteract.d.ts +++ b/dist/smartinteract.classes.smartinteract.d.ts @@ -1,5 +1,6 @@ /// import * as q from 'q'; +import { Objectmap } from 'lik'; export declare type questionType = 'input' | 'confirm' | 'list' | 'rawlist' | 'expand' | 'checkbox' | 'password' | 'editor'; export interface IChoiceObject { name: string; @@ -10,10 +11,12 @@ export interface IQuestionObject { type: questionType; message: string; default: any; - choices: string[] | IChoiceObject[]; - validate: IValidateFunction; + choices?: string[] | IChoiceObject[]; + validate?: IValidateFunction; } export interface IAnswerObject { + name: string; + value: any; } export interface IValidateFunction { (anyObject: any): boolean; @@ -34,7 +37,7 @@ export declare class SmartInteract { * allows you to ask a single question and returns the answer in a promise * skips the queue */ - askQuestion(optionsArg: IQuestionObject): q.Promise; + askQuestion(optionsArg: IQuestionObject): q.Promise; /** * add questions to queue */ @@ -42,5 +45,27 @@ export declare class SmartInteract { /** * run the question queue */ - runQueue(): q.Promise; + runQueue(): q.Promise; + /** + * checks if the current env is valid for userinput + */ + private isValidEnv(); +} +/** + * class AnswerBucket holds answers + */ +export declare class AnswerBucket { + answerMap: Objectmap; + /** + * add an answer to the bucket + */ + addAnswer(answerArg: IAnswerObject): void; + /** + * gets an answer for a specific name + */ + getAnswerFor(nameArg: string): any; + /** + * gets all answers as array + */ + getAllAnswers(): IAnswerObject[]; } diff --git a/dist/smartinteract.classes.smartinteract.js b/dist/smartinteract.classes.smartinteract.js index 56edbfb..de789b6 100644 --- a/dist/smartinteract.classes.smartinteract.js +++ b/dist/smartinteract.classes.smartinteract.js @@ -24,17 +24,28 @@ class SmartInteract { */ askQuestion(optionsArg) { let done = q.defer(); - plugins.inquirer.prompt([{ + if (this.isValidEnv()) { + plugins.inquirer.prompt([{ + name: optionsArg.name, + type: optionsArg.type, + message: optionsArg.message, + default: optionsArg.default, + choices: optionsArg.choices, + validate: optionsArg.validate + }]).then((answers) => { + done.resolve({ + name: optionsArg.name, + value: answers[optionsArg.name] + }); + }); + } + else { + let answer = { name: optionsArg.name, - type: optionsArg.type, - message: optionsArg.message, - default: optionsArg.default, - choices: optionsArg.choices, - validate: optionsArg.validate - }]).then((answers) => { - console.log(answers); - done.resolve(answers); - }); + value: optionsArg.default + }; + done.resolve(answer); + } return done.promise; } /** @@ -48,22 +59,63 @@ class SmartInteract { */ runQueue() { let done = q.defer(); - let answerMap = new lik_1.Objectmap(); + let answerBucket = new AnswerBucket(); let handleQuestion = () => { let oneQuestion = this.questionMap.getOneAndRemove(); - this.askQuestion(oneQuestion).then(x => { - answerMap.addArray(x); + this.askQuestion(oneQuestion).then((answerArg) => { + answerBucket.addAnswer(answerArg); if (!this.questionMap.isEmpty()) { handleQuestion(); // recursion: as questions until empty } else { - done.resolve(answerMap.getArray()); // when empty, then resolve promise + done.resolve(answerBucket); // when empty, then resolve promise } }); }; handleQuestion(); return done.promise; } + /** + * checks if the current env is valid for userinput + */ + isValidEnv() { + if (!process.env.CI) { + return true; + } + else { + return false; + } + } } exports.SmartInteract = SmartInteract; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRpbnRlcmFjdC5jbGFzc2VzLnNtYXJ0aW50ZXJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGludGVyYWN0LmNsYXNzZXMuc21hcnRpbnRlcmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsbURBQWtEO0FBQ2xELHVCQUFzQjtBQUN0Qiw2QkFBK0I7QUEwQi9COztHQUVHO0FBQ0g7SUFPSTs7T0FFRztJQUNILFlBQVksZ0JBQW9DO1FBUmhEOztXQUVHO1FBQ0ssZ0JBQVcsR0FBRyxJQUFJLGVBQVMsRUFBbUIsQ0FBQTtRQU1sRCxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7SUFDTCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLFVBQTJCO1FBQ25DLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQW1CLENBQUE7UUFDckMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJO2dCQUNyQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7Z0JBQ3JCLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztnQkFDM0IsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPO2dCQUMzQixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87Z0JBQzNCLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTthQUNoQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUF3QjtZQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDekIsQ0FBQyxDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsZ0JBQW1DO1FBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNKLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQW1CLENBQUE7UUFDckMsSUFBSSxTQUFTLEdBQUcsSUFBSSxlQUFTLEVBQWlCLENBQUE7UUFDOUMsSUFBSSxjQUFjLEdBQUc7WUFDakIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQTtZQUNwRCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM5QixjQUFjLEVBQUUsQ0FBQSxDQUFDLHNDQUFzQztnQkFDM0QsQ0FBQztnQkFBQyxJQUFJLENBQUMsQ0FBQztvQkFDSixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBLENBQUMsbUNBQW1DO2dCQUMxRSxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUE7UUFDTixDQUFDLENBQUE7UUFDRCxjQUFjLEVBQUUsQ0FBQTtRQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUN2QixDQUFDO0NBQ0o7QUE5REQsc0NBOERDIn0= \ No newline at end of file +/** + * class AnswerBucket holds answers + */ +class AnswerBucket { + constructor() { + this.answerMap = new lik_1.Objectmap(); + } + /** + * add an answer to the bucket + */ + addAnswer(answerArg) { + this.answerMap.add(answerArg); + } + /** + * gets an answer for a specific name + */ + getAnswerFor(nameArg) { + let answer = this.answerMap.find(answerArg => { + return answerArg.name === nameArg; + }); + return answer.value; + } + /** + * gets all answers as array + */ + getAllAnswers() { + return this.answerMap.getArray(); + } +} +exports.AnswerBucket = AnswerBucket; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRpbnRlcmFjdC5jbGFzc2VzLnNtYXJ0aW50ZXJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGludGVyYWN0LmNsYXNzZXMuc21hcnRpbnRlcmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsbURBQWtEO0FBQ2xELHVCQUFzQjtBQUN0Qiw2QkFBK0I7QUEyQi9COztHQUVHO0FBQ0g7SUFPSTs7T0FFRztJQUNILFlBQVksZ0JBQW9DO1FBUmhEOztXQUVHO1FBQ0ssZ0JBQVcsR0FBRyxJQUFJLGVBQVMsRUFBbUIsQ0FBQTtRQU1sRCxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7SUFDTCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLFVBQTJCO1FBQ25DLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQWlCLENBQUE7UUFDbkMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwQixPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNyQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7b0JBQ3JCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtvQkFDckIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPO29CQUMzQixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87b0JBQzNCLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztvQkFDM0IsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO2lCQUNoQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUF3QjtnQkFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQztvQkFDVCxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7b0JBQ3JCLEtBQUssRUFBRSxPQUFPLENBQUMsVUFB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 \ No newline at end of file diff --git a/test/test.js b/test/test.js index bb61c80..d54b9ef 100644 --- a/test/test.js +++ b/test/test.js @@ -9,6 +9,29 @@ describe('smartinteract', function () { should(testInteract).be.instanceOf(smartinteract.SmartInteract); }); it('should add question to SmartInteract instance', function () { + testInteract.addQuestions([{ + name: 'testQuestion1', + type: 'input', + message: 'what is your favourite color? Answer is blue', + default: 'blue' + }]); + testInteract.addQuestions([{ + name: 'testQuestion2', + type: 'input', + message: 'what is your second favourite color? Answer is red', + default: 'red' + }]); + }); + it('should use default value when not in CI', function (done) { + this.timeout(30000); + testInteract.runQueue().then(answerBucket => { + should(answerBucket.getAnswerFor('testQuestion1')).equal('blue'); + should(answerBucket.getAnswerFor('testQuestion2')).equal('red'); + done(); + }).catch(err => { + console.log(err); + throw err; + }); }); }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQixpQ0FBZ0M7QUFFaEMsK0NBQThDO0FBRTlDLFFBQVEsQ0FBQyxlQUFlLEVBQUU7SUFDdEIsSUFBSSxZQUFZLENBQUE7SUFDaEIsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1FBQ3JDLFlBQVksR0FBRyxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNoRCxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDbkUsQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMsK0NBQStDLEVBQUU7SUFFcEQsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQSJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQixpQ0FBZ0M7QUFFaEMsK0NBQThDO0FBRTlDLFFBQVEsQ0FBQyxlQUFlLEVBQUU7SUFDdEIsSUFBSSxZQUF5QyxDQUFBO0lBQzdDLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRTtRQUNyQyxZQUFZLEdBQUcsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDaEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ25FLENBQUMsQ0FBQyxDQUFBO0lBQ0YsRUFBRSxDQUFDLCtDQUErQyxFQUFFO1FBQ2hELFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxFQUFFLGVBQWU7Z0JBQ3JCLElBQUksRUFBRSxPQUFPO2dCQUNiLE9BQU8sRUFBRSw4Q0FBOEM7Z0JBQ3ZELE9BQU8sRUFBRSxNQUFNO2FBQ2xCLENBQUMsQ0FBQyxDQUFBO1FBQ0gsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEVBQUUsZUFBZTtnQkFDckIsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsT0FBTyxFQUFFLG9EQUFvRDtnQkFDN0QsT0FBTyxFQUFFLEtBQUs7YUFDakIsQ0FBQyxDQUFDLENBQUE7SUFDUCxDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxVQUFTLElBQUk7UUFDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNuQixZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFDckMsTUFBTSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDaEUsTUFBTSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDL0QsSUFBSSxFQUFFLENBQUE7UUFDVixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRztZQUNSLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDaEIsTUFBTSxHQUFHLENBQUE7UUFDYixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFDLENBQUEifQ== \ No newline at end of file diff --git a/test/test.ts b/test/test.ts index f86f99f..ed43c03 100644 --- a/test/test.ts +++ b/test/test.ts @@ -4,13 +4,34 @@ import * as should from 'should' import * as smartinteract from '../dist/index' describe('smartinteract', function(){ - let testInteract + let testInteract: smartinteract.SmartInteract it('should create a valid new instance', function(){ testInteract = new smartinteract.SmartInteract() should(testInteract).be.instanceOf(smartinteract.SmartInteract) }) it('should add question to SmartInteract instance', function() { - + testInteract.addQuestions([{ + name: 'testQuestion1', + type: 'input', + message: 'what is your favourite color? Answer is blue', + default: 'blue' + }]) + testInteract.addQuestions([{ + name: 'testQuestion2', + type: 'input', + message: 'what is your second favourite color? Answer is red', + default: 'red' + }]) + }) + it('should use default value when not in CI', function(done){ + this.timeout(30000) + testInteract.runQueue().then(answerBucket => { + should(answerBucket.getAnswerFor('testQuestion1')).equal('blue') + should(answerBucket.getAnswerFor('testQuestion2')).equal('red') + done() + }).catch(err => { + console.log(err) + throw err + }) }) }) - diff --git a/ts/smartinteract.classes.smartinteract.ts b/ts/smartinteract.classes.smartinteract.ts index 6327e90..1e44975 100644 --- a/ts/smartinteract.classes.smartinteract.ts +++ b/ts/smartinteract.classes.smartinteract.ts @@ -14,12 +14,13 @@ export interface IQuestionObject { type: questionType message: string default: any - choices: string[] | IChoiceObject[] - validate: IValidateFunction + choices?: string[] | IChoiceObject[] + validate?: IValidateFunction } export interface IAnswerObject { - + name: string, + value: any } export interface IValidateFunction { @@ -30,7 +31,7 @@ export interface IValidateFunction { * class SmartInteract - allows to specify an user interaction during runtime */ export class SmartInteract { - + /** * holds the qestion queue, that is emptied once you call */ @@ -48,19 +49,30 @@ export class SmartInteract { * allows you to ask a single question and returns the answer in a promise * skips the queue */ - askQuestion(optionsArg: IQuestionObject): q.Promise { - let done = q.defer() - plugins.inquirer.prompt([{ - name: optionsArg.name, - type: optionsArg.type, - message: optionsArg.message, - default: optionsArg.default, - choices: optionsArg.choices, - validate: optionsArg.validate - }]).then((answers: IAnswerObject[]) => { - console.log(answers) - done.resolve(answers) - }) + askQuestion(optionsArg: IQuestionObject): q.Promise { + let done = q.defer() + if (this.isValidEnv()) { + plugins.inquirer.prompt([{ + name: optionsArg.name, + type: optionsArg.type, + message: optionsArg.message, + default: optionsArg.default, + choices: optionsArg.choices, + validate: optionsArg.validate + }]).then((answers: IAnswerObject[]) => { + done.resolve({ + name: optionsArg.name, + value: answers[optionsArg.name] + }) + }) + } else { + let answer: IAnswerObject = { + name: optionsArg.name, + value: optionsArg.default + } + done.resolve(answer) + } + return done.promise } @@ -75,20 +87,62 @@ export class SmartInteract { * run the question queue */ runQueue() { - let done = q.defer() - let answerMap = new Objectmap() + let done = q.defer() + let answerBucket = new AnswerBucket() let handleQuestion = () => { let oneQuestion = this.questionMap.getOneAndRemove() - this.askQuestion(oneQuestion).then(x => { - answerMap.addArray(x) + this.askQuestion(oneQuestion).then((answerArg: IAnswerObject) => { + answerBucket.addAnswer(answerArg) if (!this.questionMap.isEmpty()) { handleQuestion() // recursion: as questions until empty } else { - done.resolve(answerMap.getArray()) // when empty, then resolve promise + done.resolve(answerBucket) // when empty, then resolve promise } }) } handleQuestion() return done.promise } + + /** + * checks if the current env is valid for userinput + */ + private isValidEnv(): boolean { + if (!process.env.CI) { + return true + } else { + return false + } + } +} + +/** + * class AnswerBucket holds answers + */ +export class AnswerBucket { + answerMap = new Objectmap() + + /** + * add an answer to the bucket + */ + addAnswer(answerArg: IAnswerObject) { + this.answerMap.add(answerArg) + } + + /** + * gets an answer for a specific name + */ + getAnswerFor(nameArg: string) { + let answer = this.answerMap.find(answerArg => { + return answerArg.name === nameArg + }) + return answer.value + } + + /** + * gets all answers as array + */ + getAllAnswers() { + return this.answerMap.getArray() + } }