protected override Maybe <IReportNode> Execute(TextParser p) { if (!Mem(p.Between("(", ")"))) { return(Error(LastResult)); } var content = LastResult.Value; Maybe <int> x = content.SkipWhitespaces().Integer(); if (!x) { return(Error(x)); } Maybe <int> y = content.SkipWhitespaces().After(",").SkipWhitespaces().Integer(); if (!y) { return(Error(y)); } Maybe <int> z = Maybe <int> .NA; Maybe <string> label = Maybe <string> .NA; if (content.SkipWhitespaces().After(",")) { z = content.SkipWhitespaces().Integer(); content.SkipWhitespaces(); label = content.Between("<", ">").AsString(); } content.Try(parser => { if (parser.SkipWhitespaces().After(",")) { z = parser.SkipWhitespaces().Integer(); parser.SkipWhitespaces(); label = parser.Between("<", ">").AsString(); return(new Maybe <object>(null)); } return(Maybe <object> .NA); }); return(Ok(ReportNode.Object( ReportNode.Int("x", x), ReportNode.Int("y", y), z ? ReportNode.Int("z", z) : null, label ? ReportNode.Str("label", label) : null ))); }
protected override Maybe <IReportNode> Execute(TextParser p) { var weight = p.After("Weight:").SkipWhitespaces().Integer(); if (!weight) { return(Error(weight)); } return(Ok(ReportNode.Bag( ReportNode.Int("weight", weight) ))); }
protected override Maybe <IReportNode> Execute(TextParser p) { var capacities = p.After("Capacity:").SkipWhitespaces(); if (!capacities) { return(Error(capacities)); } var flying = capacities.Integer(); if (!flying) { return(Error(flying)); } var riding = capacities.After("/").Integer(); if (!riding) { return(Error(riding)); } var walking = capacities.After("/").Integer(); if (!walking) { return(Error(walking)); } var swimming = capacities.After("/").Integer(); if (!swimming) { return(Error(swimming)); } return(Ok(ReportNode.Bag( ReportNode.Key("capacity", ReportNode.Object( ReportNode.Int("flying", flying), ReportNode.Int("riding", riding), ReportNode.Int("walking", walking), ReportNode.Int("swimming", swimming) )) ))); }
protected override Maybe <IReportNode> Execute(TextParser p) { var name = p.Before("[").SkipWhitespacesBackwards().AsString(); if (!name) { return(Error(name)); } var code = p.Between("[", "]").AsString(); if (!code) { return(Error(code)); } p.PushBookmark(); var level = p.SkipWhitespaces().Integer(); var days = Maybe <int> .NA; if (level) { p.RemoveBookmark(); days = p.Try(parser => parser.SkipWhitespaces().Between("(", ")").Integer()); } else { p.PopBookmark(); } return(Ok(ReportNode.Object( ReportNode.Str("name", name), ReportNode.Str("code", code), level ? ReportNode.Int("level", level) : null, days ? ReportNode.Int("days", days) : null ))); }