-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathInspector.ts
57 lines (49 loc) · 1.9 KB
/
Inspector.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import { InspectionResult, InputPapers } from './types';
import { Papers } from './Papers';
import { Bulletin } from './Bulletin';
import { BulletinInterpreter } from './interpreters/bulletin/BulletinInterpreter';
import { RulesetBuilder } from './RulesetBuilder';
import { Ruleset } from './Ruleset';
import { PapersInterpreter } from './PapersInterpreter';
export class Inspector {
private bulletin: Bulletin;
private ruleset: Ruleset;
constructor () {
this.bulletin = new Bulletin();
}
public receiveBulletin (inputBulletin: string): void {
this.updateBulletin(inputBulletin);
this.ruleset = this.buildRuleset();
}
private updateBulletin (inputBulletin: string): void {
this.bulletin.clearWanted();
const interpreter = new BulletinInterpreter();
interpreter.interpret(inputBulletin, this.bulletin);
}
private buildRuleset (): Ruleset {
const rulesetBuilder = new RulesetBuilder();
rulesetBuilder.fromBulletin(this.bulletin);
return rulesetBuilder.getRuleset();
}
public inspect (inputPapers: InputPapers): InspectionResult {
const papers = this.buildPapers(inputPapers);
const detainmentRule = this.ruleset.getDetainmentRule(papers);
if (detainmentRule) {
return 'Detainment: ' + detainmentRule.getMessage();
}
const denialRule = this.ruleset.getDenialRule(papers);
if (denialRule) {
return 'Entry denied: ' + denialRule.getMessage();
}
const personalData = papers.getPersonalData();
if (personalData.isNationalOfArstotzka()) {
return 'Glory to Arstotzka.';
} else {
return 'Cause no trouble.';
}
}
private buildPapers (inputPapers: InputPapers): Papers {
const interpreter = new PapersInterpreter();
return interpreter.interpret(inputPapers);
}
}