public CommandParserRepository()
{
mParsers = new Dictionary<string, Func<string[], IParseResult>> {
{ "ins", (tokens) => {
var it = tokens.Skip(1).GetEnumerator();
var status = ParseResultStatus.InvalidMoney;
var money = Money.Unknown;
var count = 1;
if (it.MoveNext()) {
int v;
if (! int.TryParse(it.Current, out v)) {
return new ParseErrorResult(ParseResultStatus.InvalidMoney);
}
var m = MoneyResolver.Resolve(v);
if (m.Status != MoneyStatus.Available) {
return new ParseErrorResult(ParseResultStatus.InvalidMoney);
}
status = ParseResultStatus.Success;
money = m.Type;
}
if (it.MoveNext()) {
if (! int.TryParse(it.Current, out count)) {
return new ParseErrorResult(ParseResultStatus.InvalidMoney);
}
if (count <= 0) {
return new ParseErrorResult(ParseResultStatus.InvalidMoney);
}
}
return new MoneyInsertionParseResult {
Status = status,
Money = money,
Count = count,
};
}
},
{ "eject", (token) => {
return new MoneyEjectParseResult {
Status = ParseResultStatus.Success,
};
}
},
{ "show", (tokens) => {
var it = tokens.Skip(1).GetEnumerator();
if (it.MoveNext()) {
var subCommand = it.Current;
switch (subCommand) {
case "amount":
return new ShowAmountParseResult {
Status = ParseResultStatus.Success,
};
case "item":
return new ShowItemParseResult {
Status = ParseResultStatus.Success,
};
}
}
return new ParseErrorResult(ParseResultStatus.NotSupportedCommand);
}
},
{ "buy", (tokens) => {
var tmp = tokens
.Skip(1)
.Select(s => {
int p;
return new { Valid = int.TryParse(s, out p), Position = p};
})
;
if (tmp.All(t => t.Valid)) {
var positions = tmp
.Select(p => p.Position)
.ToArray()
;
return new PurchaseParseResult {
Status = ParseResultStatus.Success,
Positions = positions
};
}
else {
return new ParseErrorResult(ParseResultStatus.InvalidArgs);
}
}
},
{ "help", (tokens) => {
var it = tokens.Skip(1).GetEnumerator();
var result = new HelpParseResult {
Status = ParseResultStatus.Success
};
if (it.MoveNext()) {
result.Command = it.Current;
}
return result;
}
},
};
}