예제 #1
0
        protected override Maybe <IReportNode> Execute(TextParser p)
        {
            p.PushBookmark();
            var word = p.Word();

            if (!word)
            {
                return(Error(word));
            }

            int amount = 1;

            if (word.Match("unlimited"))
            {
                amount = -1;
                p.RemoveBookmark();
            }
            else
            {
                var intAmount = word.Integer();
                if (intAmount)
                {
                    amount = intAmount.Value;
                    p.RemoveBookmark();
                }
                else
                {
                    p.PopBookmark();
                }
            }

            Maybe <string> name = p.SkipWhitespaces().Before("[").SkipWhitespacesBackwards().AsString();

            if (!name)
            {
                return(Error(name));
            }

            Maybe <string> code = p.Between("[", "]").AsString();

            if (!code)
            {
                return(Error(code));
            }

            Maybe <int> price = p.Try(parser => parser.SkipWhitespaces().Word().Match("at")
                ? p.SkipWhitespaces().Word().Seek(1).Integer()
                : Maybe <int> .NA
                                      );

            return(Ok(ReportNode.Object(
                          ReportNode.Int("amount", amount),
                          ReportNode.Str("name", name),
                          ReportNode.Str("code", code),
                          price ? ReportNode.Int("price", price) : null
                          )));
        }