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());
        }
Exemple #2
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());
        }
        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());
        }
        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)));
            }
        }
Exemple #5
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 Parse(out ICoordinates result)
        {
            result = default;

            ReadResults readResults = ReadDouble(out double left);

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

            readResults = ReadDouble(out double up);
            if (!readResults.Successful)
            {
                return(readResults);
            }
            if (UseBedrock)
            {
                StringReader.SkipWhitespace();
            }
            else
            {
                if (!StringReader.AtEndOfArgument())
                {
                    StringReader.SetCursor(Start);
                    return(ReadResults.Failure(CommandError.Vec3CoordinatesIncomplete().WithContext(StringReader)));
                }
                StringReader.Skip();
            }

            readResults = ReadDouble(out double forwards);
            if (readResults.Successful)
            {
                result = new LocalCoordinates(left, up, forwards);
            }
            return(readResults);
        }
 public override ReadResults Validate(JsonObject obj, string key, ComponentReader componentReader, Components components, IStringReader reader, int start, DispatcherResources resources)
 {
     if (!IsText(obj.GetChild(key)))
     {
         reader.SetCursor(start);
         return(ReadResults.Failure(ComponentCommandError.InvalidComponent(key, JsonArgumentType.String, obj.GetChild(key).GetArgumentType()).WithContext(reader)));
     }
     if (!UUID.TryParse(obj.GetChild(key).ToString(), out _))
     {
         reader.SetCursor(start);
         return(ReadResults.Failure(CommandError.InvalidUuid().WithContext(reader)));
     }
     return(ReadResults.Success());
 }
Exemple #8
0
        public ReadResults ReadCompound(out INbtTag result)
        {
            CompoundNbtTag compound;

            result = compound = new CompoundNbtTag();
            ReadResults readResults = Reader.Expect('{');

            if (!readResults.Successful)
            {
                return(readResults);
            }
            Reader.SkipWhitespace();
            while (Reader.CanRead() && Reader.Peek() != '}')
            {
                int start = Reader.GetCursor();
                readResults = ReadKey(out string key);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
                if (string.IsNullOrEmpty(key))
                {
                    Reader.SetCursor(start);
                    return(ReadResults.Failure(CommandError.ExpectedKey().WithContext(Reader)));
                }
                readResults = Reader.Expect(':');
                if (!readResults.Successful)
                {
                    return(readResults);
                }
                readResults = ReadValue(out INbtTag value);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
                compound.Add(key, value);
                if (!HasElementSeparator())
                {
                    break;
                }
                if (Reader.CanRead())
                {
                    continue;
                }
                return(ReadResults.Failure(CommandError.ExpectedKey().WithContext(Reader)));
            }
            return(Reader.Expect('}'));
        }
Exemple #9
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);
        }
        private static ReadResults SetExecutor(EntitySelectorParser parser, IStringReader reader, bool negated, string originalName, int previousStart, DispatcherResources resources, bool useBedrock)
        {
            if (parser.IsTypeLimited())
            {
                reader.SetCursor(previousStart);
                return(ReadResults.Failure(CommandError.InapplicableOption(originalName).WithContext(reader)));
            }

            int start = reader.GetCursor();

            bool isTag = false;

            if (reader.CanRead() && reader.Peek() == '#')
            {
                reader.Skip();
                isTag = true;
            }

            ReadResults readResults = ResourceLocation.TryRead(reader, out ResourceLocation entity);

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

            if (ResourceLocation.PLAYER_ENTITY.Equals(entity) && !negated)
            {
                parser.SetIncludesEntities(false);
            }
            else if (useBedrock)
            {
                // Temporary
                return(ReadResults.Success());
            }
            else if (!isTag)
            {
                if (!resources.Entities.Contains(entity))
                {
                    reader.SetCursor(start);
                    return(ReadResults.Failure(CommandError.InvalidEntityType(entity).WithContext(reader)));
                }
            }
            parser.AddArgument(new ParsedArgument <Entity>(new Entity(entity, isTag), false));
            return(ReadResults.Success());
        }
Exemple #11
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 ValidateContents(IJsonArgument json, Components components)
 {
     if (json is JsonNull)
     {
         StringReader.SetCursor(Start);
         return(ReadResults.Failure(ComponentCommandError.UnknownComponent(json).WithContext(StringReader)));
     }
     else if (json is JsonObject jsonObject)
     {
         return(ValidateObject(jsonObject, components));
     }
     else if (json is JsonArray jsonArray)
     {
         return(ValidateArray(jsonArray, components));
     }
     else
     {
         return(ReadResults.Success());
     }
 }
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out long result)
        {
            int         start       = reader.GetCursor();
            ReadResults readResults = reader.ReadLong(out result);

            if (readResults.Successful)
            {
                if (result < Minimum)
                {
                    reader.SetCursor(start);
                    return(ReadResults.Failure(CommandError.LongTooLow(result, Minimum).WithContext(reader)));
                }
                if (result > Maximum)
                {
                    reader.SetCursor(start);
                    return(ReadResults.Failure(CommandError.LongTooHigh(result, Maximum).WithContext(reader)));
                }
            }

            return(readResults);
        }
        public ReadResults Read(Converter <string> function, Func <string, CommandError> invalidNumberErrorProvider, T minimum, T maximum, bool loopable, out Range <T> result)
        {
            result = default;
            if (!StringReader.CanRead())
            {
                return(ReadResults.Failure(CommandError.ExpectedValueOrRange().WithContext(StringReader)));
            }

            int         start = StringReader.GetCursor();
            T?          right;
            ReadResults readResults = ReadNumber(function, invalidNumberErrorProvider, out T? left);

            if (!readResults.Successful)
            {
                return(readResults);
            }
            if (StringReader.CanRead(2) && StringReader.Peek() == '.' && StringReader.Peek(1) == '.')
            {
                StringReader.Skip(2);
                readResults = ReadNumber(function, invalidNumberErrorProvider, out right);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
            }
            else
            {
                right = left;
            }

            if (left == null && right == null)
            {
                return(ReadResults.Failure(CommandError.ExpectedValueOrRange().WithContext(StringReader)));
            }

            if (left == null)
            {
                left = minimum;
            }
            if (right == null)
            {
                right = maximum;
            }

            if (!loopable && ((T)left).CompareTo((T)right) > 0)
            {
                StringReader.SetCursor(start);
                return(ReadResults.Failure(CommandError.RangeMinBiggerThanMax().WithContext(StringReader)));
            }

            result = new Range <T>((T)left, (T)right);
            return(ReadResults.Success());
        }
        public override ReadResults Validate(JsonObject obj, string key, ComponentReader componentReader, Components components, IStringReader reader, int start, DispatcherResources resources)
        {
            ComponentArray componentArray = new ComponentArray();
            int            end            = reader.GetCursor();
            ReadResults    readResults    = componentArray.Validate(obj, key, componentReader, components, reader, start, resources);

            if (!readResults.Successful)
            {
                reader.SetCursor(end);
                ComponentRoot componentRoot = new ComponentRoot();
                return(componentRoot.Validate(obj, key, componentReader, components, reader, start, resources));
            }

            return(ReadResults.Success());
        }
Exemple #16
0
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out Angle result)
        {
            int         start       = reader.GetCursor();
            ReadResults readResults = new AngleParser(reader).Read(out result);

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

            if (float.IsNaN(result.Value) || float.IsInfinity(result.Value))
            {
                reader.SetCursor(start);
                return(ReadResults.Failure(CommandError.InvalidAngle().WithContext(reader)));
            }
            return(ReadResults.Success());
        }
Exemple #17
0
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out HashSet <char> result)
        {
            result = new HashSet <char>();
            int start = reader.GetCursor();

            while (!reader.AtEndOfArgument())
            {
                char c = reader.Read();
                if (!Characters.Contains(c) || result.Contains(c))
                {
                    reader.SetCursor(start);
                    return(ReadResults.Failure(CommandError.InvalidSwizzle(Characters).WithContext(reader)));
                }
                result.Add(c);
            }
            return(ReadResults.Success());
        }
Exemple #18
0
 public ReadResults Parse(IStringReader reader, DispatcherResources resources, out string result)
 {
     if (Type == StringType.GREEDY)
     {
         result = reader.GetRemaining();
         reader.SetCursor(reader.GetLength());
         return(ReadResults.Success());
     }
     else if (Type == StringType.WORD)
     {
         return(reader.ReadUnquotedString(out result));
     }
     else
     {
         return(reader.ReadString(out result));
     }
 }
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out GameType result)
        {
            result = default;
            int         start       = reader.GetCursor();
            ReadResults readResults = reader.ReadUnquotedString(out string gamemode);

            if (!readResults.Successful)
            {
                return(readResults);
            }
            if (!resources.Gamemodes.TryGet(gamemode, out result))
            {
                reader.SetCursor(start);
                return(ReadResults.Failure(CommandError.UnknownGamemode(gamemode).WithContext(reader)));
            }

            return(ReadResults.Success());
        }
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out ItemSlot result)
        {
            result = default;
            int         start       = reader.GetCursor();
            ReadResults readResults = reader.ReadUnquotedString(out string slot);

            if (!readResults.Successful)
            {
                return(readResults);
            }
            if (!resources.ItemSlots.Contains(slot))
            {
                reader.SetCursor(start);
                return(ReadResults.Failure(CommandError.UnknownSlot(slot).WithContext(reader)));
            }
            result = new Results.Arguments.ItemSlot(slot);
            return(ReadResults.Success());
        }
        public ReadResults ParseInteger(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.Vec3CoordinatesIncomplete().WithContext(StringReader)));
                }
                StringReader.Skip();
            }

            readResults = worldCoordinateParser.ReadInteger(out WorldCoordinate y);
            if (!readResults.Successful)
            {
                return(readResults);
            }
            if (UseBedrock)
            {
                StringReader.SkipWhitespace();
            }
            else
            {
                if (!StringReader.AtEndOfArgument())
                {
                    StringReader.SetCursor(Start);
                    return(ReadResults.Failure(CommandError.Vec3CoordinatesIncomplete().WithContext(StringReader)));
                }
                StringReader.Skip();
            }

            readResults = worldCoordinateParser.ReadInteger(out WorldCoordinate z);
            if (readResults.Successful)
            {
                result = new WorldCoordinates(x, y, z);
            }
            return(readResults);
        }
Exemple #22
0
        public override ReadResults Validate(JsonObject obj, string key, ComponentReader componentReader, Components components, IStringReader reader, int start, DispatcherResources resources)
        {
            if (!obj.ContainsKey(BindTo))
            {
                return(ReadResults.Success());
            }
            if (!IsText(obj.GetChild(BindTo)))
            {
                reader.SetCursor(start);
                return(ReadResults.Failure(ComponentCommandError.InvalidComponent(key, JsonArgumentType.String, obj.GetChild(BindTo).GetArgumentType()).WithContext(reader)));
            }

            string binding = obj.GetChild(BindTo).ToString();

            if (Values.TryGetValue(binding, out ComponentArgument argument))
            {
                return(argument.Validate(obj, key, componentReader, components, reader, start, resources));
            }
            return(ReadResults.Success());
        }
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out Anchor result)
        {
            result = default;
            int         start       = reader.GetCursor();
            ReadResults readResults = reader.ReadUnquotedString(out string anchor);

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

            if (!resources.Anchors.Contains(anchor))
            {
                reader.SetCursor(start);
                return(ReadResults.Failure(CommandError.InvalidEntityAnchor(anchor).WithContext(reader)));
            }

            result = new Anchor(anchor);
            return(ReadResults.Success());
        }
        private static ReadResults ReadGamemode(EntitySelectorParser parser, IStringReader reader, DispatcherResources resources)
        {
            int         start       = reader.GetCursor();
            ReadResults readResults = reader.ReadUnquotedString(out string gamemode);

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

            if (resources.Gamemodes.TryGet(gamemode, out _))
            {
                parser.AddArgument(new ParsedArgument <Literal>(new Literal(gamemode), false));
                return(ReadResults.Success());
            }
            else
            {
                reader.SetCursor(start);
                return(ReadResults.Failure(CommandError.UnknownGamemode(gamemode).WithContext(reader)));
            }
        }
        private ReadResults ReadBlockStates(out Dictionary <string, string> result)
        {
            result = new Dictionary <string, string>();

            ReadResults readResults = StringReader.Expect('[');

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

            while (StringReader.CanRead() && StringReader.Peek() != ']')
            {
                StringReader.SkipWhitespace();
                int start = StringReader.GetCursor();

                readResults = StringReader.ReadString(out string property);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
                if (result.ContainsKey(property))
                {
                    StringReader.SetCursor(start);
                    return(ReadResults.Failure(CommandError.DuplicateBlockProperty(Block, property).WithContext(StringReader)));
                }

                if (!IsTag && !Resources.Blocks.ContainsProperty(Block, property))
                {
                    StringReader.SetCursor(start);
                    return(ReadResults.Failure(CommandError.UnknownBlockProperty(Block, property).WithContext(StringReader)));
                }

                StringReader.SkipWhitespace();
                start = StringReader.GetCursor();

                if (!StringReader.CanRead() || StringReader.Peek() != '=')
                {
                    return(ReadResults.Failure(CommandError.ExpectedValueForBlockProperty(Block, property)));
                }
                StringReader.Skip();

                StringReader.SkipWhitespace();
                readResults = StringReader.ReadString(out string value);
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                if (!IsTag && !Resources.Blocks.PropertyContainsValue(Block, property, value))
                {
                    StringReader.SetCursor(start);
                    return(ReadResults.Failure(CommandError.UnknownBlockPropertyValue(Block, property, value).WithContext(StringReader)));
                }

                result.Add(property, value);

                StringReader.SkipWhitespace();
                if (StringReader.CanRead() && StringReader.Peek() == ',')
                {
                    StringReader.Skip();
                    continue;
                }
                break;
            }

            if (!StringReader.CanRead() || StringReader.Peek() != ']')
            {
                return(ReadResults.Failure(CommandError.UnclosedBlockStateProperties().WithContext(StringReader)));
            }
            StringReader.Skip();

            return(ReadResults.Success());
        }