Exemple #1
0
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out Message result)
        {
            result = default;
            string message = reader.GetRemaining();
            Dictionary <int, EntitySelector> selectors = new Dictionary <int, EntitySelector>();

            while (reader.CanRead())
            {
                if (reader.Peek() == '@')
                {
                    if (reader.CanRead(2) && "parse".Contains(reader.Peek(1)))
                    {
                        int         start       = reader.GetCursor();
                        ReadResults readResults = new EntitySelectorParser(reader, resources, UseBedrock).Parse(out EntitySelector entitySelector);
                        if (!readResults.Successful)
                        {
                            return(readResults);
                        }
                        selectors.Add(start, entitySelector);
                    }
                    else
                    {
                        reader.Skip(2);
                    }
                    continue;
                }
                reader.Skip();
            }

            result = new Message(message, selectors);
            return(ReadResults.Success());
        }
Exemple #2
0
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out Team result)
        {
            ReadResults readResults = reader.ReadUnquotedString(out string team);

            result = new Team(team);
            return(readResults);
        }
        public ReadResults Read(out Angle result)
        {
            result = default;
            if (!StringReader.CanRead())
            {
                return(ReadResults.Failure(CommandError.ExpectedAngle().WithContext(StringReader)));
            }
            if (StringReader.Peek() == '^')
            {
                return(ReadResults.Failure(CommandError.MixedCoordinateType().WithContext(StringReader)));
            }

            bool isRelative = IsRelative();

            if (StringReader.AtEndOfArgument())
            {
                result = new Angle(0.0f, isRelative);
                return(ReadResults.Success());
            }

            ReadResults readResults = StringReader.ReadFloat(out float value);

            if (readResults.Successful)
            {
                result = new Angle(value, isRelative);
            }
            return(readResults);
        }
Exemple #4
0
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out EntitySelector result)
        {
            int start = reader.GetCursor();
            EntitySelectorParser entitySelectorParser = new EntitySelectorParser(reader, resources, UseBedrock);
            ReadResults          readResults          = entitySelectorParser.Parse(out result);

            if (!readResults.Successful)
            {
                return(readResults);
            }

            if (result.MaxResults > 1 && SingleEntity)
            {
                reader.SetCursor(start);
                if (PlayersOnly)
                {
                    return(ReadResults.Failure(CommandError.SelectorTooManyPlayers().WithContext(reader)));
                }
                else
                {
                    return(ReadResults.Failure(CommandError.SelectorTooManyEntities().WithContext(reader)));
                }
            }
            if (result.IncludesEntities && PlayersOnly && !result.IsSelf)
            {
                reader.SetCursor(start);
                return(ReadResults.Failure(CommandError.SelectorPlayersOnly().WithContext(reader)));
            }

            return(ReadResults.Success());
        }
        public ReadResults ReadString(out JsonString result)
        {
            result = default;
            string actualString = "";

            if (!StringReader.CanRead() || StringReader.Peek() != STRING_CHARACTER)
            {
                return(ReadResults.Failure(JsonCommandError.MalformedJson().WithContext(StringReader)));
            }
            StringReader.Skip();

            bool escaped = false;

            while (StringReader.CanRead())
            {
                char c = StringReader.Read();
                if (escaped)
                {
                    if (c == UNICODE_CHARACTER)
                    {
                        if (!StringReader.CanRead(4))
                        {
                            return(ReadResults.Failure(JsonCommandError.UnterminatedEscapeSequence().WithContext(StringReader)));
                        }
                        string unicode = StringReader.Read(4);
                        if (!short.TryParse(unicode, NumberStyles.HexNumber, NumberFormatInfo.InvariantInfo, out _))
                        {
                            return(ReadResults.Failure(JsonCommandError.InvalidUnicodeCharacter(unicode).WithContext(StringReader)));
                        }
                        escaped       = false;
                        actualString += c + unicode;
                    }
                    else if (ESCAPABLE_CHARACTERS.Contains(c))
                    {
                        escaped       = false;
                        actualString += c;
                    }
                    else
                    {
                        return(ReadResults.Failure(JsonCommandError.InvalidEscapeSequence().WithContext(StringReader)));
                    }
                }
                else if (c == ESCAPE_CHARACTER)
                {
                    escaped       = true;
                    actualString += c;
                }
                else if (c == STRING_CHARACTER)
                {
                    result = new JsonString(actualString);
                    return(ReadResults.Success());
                }
                else
                {
                    actualString += c;
                }
            }

            return(ReadResults.Failure(JsonCommandError.UnterminatedString().WithContext(StringReader)));
        }
        public override ReadResults Validate(JsonObject obj, string key, ComponentReader componentReader, Components components, IStringReader reader, int start, DispatcherResources resources)
        {
            if (obj.GetChild(key) is not JsonArray actualArray)
            {
                reader.SetCursor(start);
                return(ReadResults.Failure(ComponentCommandError.InvalidComponent(key, JsonArgumentType.Array, obj.GetChild(key).GetArgumentType()).WithContext(reader)));
            }

            if (actualArray.GetLength() == 0 && !MayBeEmpty)
            {
                reader.SetCursor(start);
                return(ReadResults.Failure(ComponentCommandError.EmptyComponent().WithContext(reader)));
            }

            ReadResults readResults;

            foreach (IJsonArgument child in actualArray.GetChildren())
            {
                if (ArrayContents is not null && child.GetArgumentType() != ArrayContents)
                {
                    reader.SetCursor(start);
                    return(ReadResults.Failure(ComponentCommandError.InvalidComponentArray(key, ArrayContents.Value, child.GetArgumentType()).WithContext(reader)));
                }
                readResults = componentReader.ValidateContents(child, components);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
            }

            return(ReadResults.Success());
        }
Exemple #7
0
        public ReadResults Parse(out Rotation result)
        {
            result = default;
            AngleParser angleParser = new AngleParser(StringReader);

            ReadResults readResults = angleParser.Read(out Angle yRotation);

            if (!readResults.Successful)
            {
                return(readResults);
            }
            if (!StringReader.AtEndOfArgument())
            {
                if (!UseBedrock)
                {
                    StringReader.SetCursor(Start);
                    return(ReadResults.Failure(CommandError.RotationIncomplete().WithContext(StringReader)));
                }
            }
            else
            {
                StringReader.Skip();
            }

            readResults = angleParser.Read(out Angle xRotation);
            if (readResults.Successful)
            {
                result = new Rotation(yRotation, xRotation);
            }
            return(readResults);
        }
Exemple #8
0
        protected ReadResults ValidateChildren(JsonObject obj, string key, ComponentReader componentReader, Components components, IStringReader reader, int start, DispatcherResources resources)
        {
            ReadResults readResults;

            foreach (KeyValuePair <string, ComponentArgument> child in Children)
            {
                if (obj.ContainsKey(child.Key))
                {
                    readResults = child.Value.Validate(obj, child.Key, componentReader, components, reader, start, resources);
                    if (MatchFirst || !readResults.Successful)
                    {
                        return(readResults);
                    }
                }
                else if (!child.Value.Optional && !MatchFirst)
                {
                    reader.SetCursor(start);
                    return(ReadResults.Failure(ComponentCommandError.IncompleteComponent(key, this).WithContext(reader)));
                }
            }
            if (MatchFirst)
            {
                reader.SetCursor(start);
                return(ReadResults.Failure(ComponentCommandError.UnknownComponent(obj).WithContext(reader)));
            }
            return(ReadResults.Success());
        }
        private static ReadResults ReadSort(EntitySelectorParser parser, IStringReader reader, string originalName, int previousStart, DispatcherResources resources)
        {
            if (parser.IsSorted())
            {
                reader.SetCursor(previousStart);
                return(ReadResults.Failure(CommandError.InapplicableOption(originalName).WithContext(reader)));
            }

            int         start       = reader.GetCursor();
            ReadResults readResults = reader.ReadUnquotedString(out string sort);

            if (!readResults.Successful)
            {
                return(readResults);
            }

            if (resources.Sorts.Contains(sort))
            {
                parser.AddArgument(new ParsedArgument <Literal>(new Literal(sort), false));
                return(ReadResults.Success());
            }
            else
            {
                reader.SetCursor(start);
                return(ReadResults.Failure(CommandError.UnknownSort(sort).WithContext(reader)));
            }
        }
        public ReadResults ReadDouble(out WorldCoordinate result)
        {
            result = default;
            if (!StringReader.CanRead())
            {
                return(ReadResults.Failure(CommandError.ExpectedCoordinate().WithContext(StringReader)));
            }
            if (StringReader.Peek() == '^')
            {
                return(ReadResults.Failure(CommandError.MixedCoordinateType().WithContext(StringReader)));
            }

            bool isRelative = IsRelative();
            int  start      = StringReader.GetCursor();

            if (StringReader.AtEndOfArgument() || (UseBedrock && !IsNumberPart(StringReader.Peek())))
            {
                result = new WorldCoordinate(isRelative ? 0.0d : 0.5d, isRelative);
                return(ReadResults.Success());
            }

            ReadResults readResults = StringReader.ReadDouble(out double value);

            if (!readResults.Successful)
            {
                return(readResults);
            }

            string number = StringReader.GetString()[start..StringReader.GetCursor()];
Exemple #11
0
        private ReadResults ReadListContents(ref INbtCollectionTag list)
        {
            ReadResults readResults;

            while (Reader.CanRead() && Reader.Peek() != ']')
            {
                int start = Reader.GetCursor();
                readResults = ReadValue(out INbtTag tag);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
                if (!list.Add(tag))
                {
                    Reader.SetCursor(start);
                    return(ReadResults.Failure(CommandError.NbtCannotInsert(tag, list).WithContext(Reader)));
                }
                if (!HasElementSeparator())
                {
                    break;
                }
                if (Reader.CanRead())
                {
                    continue;
                }
                return(ReadResults.Failure(CommandError.ExpectedValue().WithContext(Reader)));
            }
            return(Reader.Expect(']'));
        }
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out Objective result)
        {
            result = default;
            ReadResults readResults;
            string      objective;

            if (UseBedrock)
            {
                readResults = reader.ReadString(out objective);
            }
            else
            {
                readResults = reader.ReadUnquotedString(out objective);
            }

            if (!readResults.Successful)
            {
                return(readResults);
            }
            if (objective.Length > 16)
            {
                return(ReadResults.Failure(CommandError.ObjectiveNameTooLong()));
            }
            result = new Objective(objective);
            return(ReadResults.Success());
        }
        private ReadResults ParseNameOrUuid()
        {
            ReadResults readResults = Reader.ReadString(out string s);

            if (!readResults.Successful)
            {
                return(readResults);
            }

            if (UUID.TryParse(s, out _))
            {
                IncludesEntities = true;
            }
            else
            {
                if (string.IsNullOrEmpty(s) || s.Length > 16)
                {
                    Reader.SetCursor(Start);
                    return(ReadResults.Failure(CommandError.InvalidNameOrUuid().WithContext(Reader)));
                }
                IncludesEntities = false;
            }

            MaxResults   = 1;
            SelectorType = SelectorType.None;
            return(ReadResults.Success());
        }
        public ReadResults ParseIntegerFlat(out ICoordinates result)
        {
            result = default;
            WorldCoordinateParser worldCoordinateParser = new WorldCoordinateParser(StringReader, UseBedrock);

            ReadResults readResults = worldCoordinateParser.ReadInteger(out WorldCoordinate x);

            if (!readResults.Successful)
            {
                return(readResults);
            }
            if (UseBedrock)
            {
                StringReader.SkipWhitespace();
            }
            else
            {
                if (!StringReader.AtEndOfArgument())
                {
                    StringReader.SetCursor(Start);
                    return(ReadResults.Failure(CommandError.Vec2CoordinatesIncomplete().WithContext(StringReader)));
                }
                StringReader.Skip();
            }

            readResults = worldCoordinateParser.ReadInteger(out WorldCoordinate z);
            if (readResults.Successful)
            {
                result = new WorldCoordinates(x, new WorldCoordinate(0.0d, true), z);
            }
            return(readResults);
        }
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out Time result)
        {
            result = default;
            ReadResults readResults = reader.ReadFloat(out float time);

            if (!readResults.Successful)
            {
                return(readResults);
            }

            if (time < 0.0f)
            {
                return(ReadResults.Failure(CommandError.InvalidTickCount()));
            }

            if (!reader.AtEndOfArgument())
            {
                if (resources.TimeScalars.TryGetScalar(reader.Peek(), out int scalar))
                {
                    time *= scalar;
                    reader.Skip();
                }
                else
                {
                    return(ReadResults.Failure(CommandError.InvalidTimeUnit().WithContext(reader)));
                }
            }

            result = new Time((int)time);
            return(ReadResults.Success());
        }
Exemple #16
0
        private ReadResults ReadTypedValue(out INbtTag result)
        {
            result = default;

            Reader.SkipWhitespace();
            int         start = Reader.GetCursor();
            ReadResults readResults;

            if (Reader.IsQuotedStringStart(Reader.Peek()))
            {
                readResults = Reader.ReadQuotedString(out string quotedString);
                if (readResults.Successful)
                {
                    result = new StringNbtTag(quotedString);
                }
                return(readResults);
            }
            readResults = Reader.ReadUnquotedString(out string s);
            if (!readResults.Successful)
            {
                return(readResults);
            }
            if (string.IsNullOrEmpty(s))
            {
                Reader.SetCursor(start);
                return(ReadResults.Failure(CommandError.ExpectedValue()));
            }

            result = GetType(s);
            return(ReadResults.Success());
        }
        public ReadResults Handle(EntitySelectorParser parser, DispatcherResources resources, string name, int start, bool useBedrock)
        {
            IStringReader reader  = parser.GetReader();
            bool          negated = false;

            if (AllowInverse)
            {
                negated = parser.ShouldInvertValue();
            }

            ReadResults readResults = Option switch
            {
                Option.SetLimit => SetLimit(parser, reader),
                Option.SetExecutor => SetExecutor(parser, reader, negated, name, start, resources, useBedrock),
                Option.Advancements => ReadAdvancements(parser, reader),
                Option.Scores => ReadScores(parser, reader),
                Option.Gamemode => ReadGamemode(parser, reader, resources),
                Option.Sort => ReadSort(parser, reader, name, start, resources),
                _ => CheckComponents(parser, reader, resources)
            };

            if (readResults.Successful)
            {
                parser.Apply(name, negated);
            }
            return(readResults);
        }
Exemple #18
0
        protected Task InvokeUnaryRequestAsync()
        {
            _httpContext !.Response.Headers.Clear();
            _trailers !.Clear();
            _requestPipe !.ReadResults.Add(new ValueTask <ReadResult>(new ReadResult(new ReadOnlySequence <byte>(_requestMessage), false, true)));

            return(_callHandler !.HandleCallAsync(_httpContext));
        }
Exemple #19
0
 public override ReadResults Validate(JsonObject obj, string key, ComponentReader componentReader, Components components, IStringReader reader, int start, DispatcherResources resources)
 {
     if (obj.GetChild(key) is not JsonNumber)
     {
         reader.SetCursor(start);
         return(ReadResults.Failure(ComponentCommandError.InvalidComponent(key, JsonArgumentType.Number, obj.GetChild(key).GetArgumentType()).WithContext(reader)));
     }
     return(ReadResults.Success());
 }
        public ReadResults ValidateObject(JsonObject json, Components components)
        {
            ReadResults readResults = ValidatePrimary(json, components);

            if (readResults.Successful)
            {
                readResults = ValidateOptional(json, components);
            }
            return(readResults);
        }
Exemple #21
0
 private ReadResults ReadKey(out string result)
 {
     Reader.SkipWhitespace();
     if (!Reader.CanRead())
     {
         result = default;
         return(ReadResults.Failure(CommandError.ExpectedKey().WithContext(Reader)));
     }
     return(Reader.ReadString(out result));
 }
Exemple #22
0
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out ItemModifier result)
        {
            result = default;
            ReadResults readResults = ResourceLocation.TryRead(reader, out ResourceLocation itemModifier);

            if (readResults.Successful)
            {
                result = new ItemModifier(itemModifier);
            }
            return(readResults);
        }
Exemple #23
0
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out Dimension result)
        {
            result = default;
            ReadResults readResults = ResourceLocation.TryRead(reader, out ResourceLocation dimension);

            if (readResults.Successful)
            {
                result = new Dimension(dimension);
            }
            return(readResults);
        }
Exemple #24
0
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out Storage result)
        {
            result = default;
            ReadResults readResults = ResourceLocation.TryRead(reader, out ResourceLocation storage);

            if (readResults.Successful)
            {
                result = new Storage(storage);
            }
            return(readResults);
        }
        public ReadResults Parse(out Block result)
        {
            result = default;

            ReadResults readResults = ReadTag();

            if (!readResults.Successful)
            {
                return(readResults);
            }

            readResults = ResourceLocation.TryRead(StringReader, out Block);
            if (!readResults.Successful)
            {
                return(readResults);
            }

            // Temporary
            if (UseBedrock)
            {
                result = new Block(Block, null, null, IsTag);
                return(ReadResults.Success());
            }

            if (!IsTag && !Resources.Blocks.ContainsBlock(Block))
            {
                return(ReadResults.Failure(CommandError.UnknownBlock(Block)));
            }

            Dictionary <string, string> blockStates = null;

            if (StringReader.CanRead() && StringReader.Peek() == '[')
            {
                readResults = ReadBlockStates(out blockStates);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
            }

            INbtTag nbt = null;

            if (StringReader.CanRead() && StringReader.Peek() == '{')
            {
                readResults = new NbtParser(StringReader).ReadCompound(out nbt);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
            }

            result = new Block(Block, blockStates, nbt, IsTag);
            return(ReadResults.Success());
        }
        public void NbtParser_ParseListShouldFail_BecauseInvalidListItem()
        {
            // Arrange
            IStringReader reader = new StringReader("[1, 3L]");

            // Act
            ReadResults readResults = NbtReader.ReadArray(reader, out _);

            // Assert
            Assert.IsFalse(readResults.Successful);
        }
        public void NbtParser_ParseArrayShouldFail_BecauseInvalidArrayType()
        {
            // Arrange
            IStringReader reader = new StringReader("[M; 1, 2, 3]");

            // Act
            ReadResults readResults = NbtReader.ReadArray(reader, out _);

            // Assert
            Assert.IsFalse(readResults.Successful);
        }
        public void NbtParser_ParseCompoundShouldFail_BecauseExpectedValue()
        {
            // Arrange
            IStringReader reader = new StringReader("{foo:}");

            // Act
            ReadResults readResults = NbtReader.ReadCompound(reader, out _);

            // Assert
            Assert.IsFalse(readResults.Successful);
        }
Exemple #29
0
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out Advancement result)
        {
            result = default;
            ReadResults readResults = ResourceLocation.TryRead(reader, out ResourceLocation advancement);

            if (readResults.Successful)
            {
                result = new Advancement(advancement);
            }
            return(readResults);
        }
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out LootTable result)
        {
            result = default;
            ReadResults readResults = ResourceLocation.TryRead(reader, out ResourceLocation lootTable);

            if (readResults.Successful)
            {
                result = new LootTable(lootTable);
            }
            return(readResults);
        }