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());
        }
        private static string GetContext(IStringReader reader)
        {
            int minimum = Math.Max(reader.GetCursor() - 10, 0);
            int maximum = Math.Min(reader.GetCursor(), reader.GetLength());

            StringBuilder builder = new StringBuilder($" at position {reader.GetCursor()}: ");

            if (minimum > 0)
            {
                builder.Append("...");
            }
            builder.Append(reader.GetString()[minimum..maximum]);
Exemple #3
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('}'));
        }
        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 #5
0
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out NbtPath result)
        {
            result = default;

            int  start  = reader.GetCursor();
            bool isRoot = true;

            ReadResults readResults;

            while (!reader.AtEndOfArgument())
            {
                readResults = ParseNode(reader, isRoot);
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                isRoot = false;
                if (!reader.CanRead())
                {
                    continue;
                }
                char c = reader.Peek();
                if (c == ' ' || c == '[' || c == '{')
                {
                    continue;
                }
                readResults = reader.Expect('.');
                if (!readResults.Successful)
                {
                    return(readResults);
                }
            }
            result = new NbtPath(reader.GetString()[start..reader.GetCursor()]);
        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 #7
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 EntitySelectorParser(IStringReader reader, DispatcherResources resources, bool useBedrock)
 {
     Reader     = reader;
     Start      = reader.GetCursor();
     Resources  = resources;
     UseBedrock = useBedrock;
 }
Exemple #9
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 #10
0
        public override ReadResults Parse(IStringReader reader, CommandContext builder, DispatcherResources resources)
        {
            int start = reader.GetCursor();
            int end   = Parse(reader);

            if (end > -1)
            {
                ParsedArgument <Literal> parsed = new ParsedArgument <Literal>(new Literal(reader.GetString()[start..end]), builder.InRoot);
Exemple #11
0
        public static ReadResults TryRead(IStringReader stringReader, out ResourceLocation result)
        {
            int start = stringReader.GetCursor();

            while (stringReader.CanRead() && IsAllowedInResourceLocation(stringReader.Peek()))
            {
                stringReader.Skip();
            }
            string input = stringReader.GetString()[start..stringReader.GetCursor()];
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out UUID result)
        {
            int start = reader.GetCursor();

            while (reader.CanRead() && IsUuidPart(reader.Peek()))
            {
                reader.Skip();
            }
            string uuid = reader.GetString()[start..reader.GetCursor()];
Exemple #13
0
        public ReadResults ByName(out ObjectiveCriterion result)
        {
            int start = StringReader.GetCursor();

            while (!StringReader.AtEndOfArgument())
            {
                StringReader.Skip();
            }
            string criterion = StringReader.GetString()[start..StringReader.GetCursor()];
        public ReadResults ReadSpecial(out IJsonArgument result)
        {
            int start = StringReader.GetCursor();

            while (StringReader.CanRead() && IsAllowedInput(StringReader.Peek()))
            {
                StringReader.Skip();
            }
            string s = StringReader.GetString()[start..StringReader.GetCursor()];
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out Operation result)
        {
            result = default;
            int start = reader.GetCursor();

            while (!reader.AtEndOfArgument())
            {
                reader.Skip();
            }
            string operation = reader.GetString()[start..reader.GetCursor()];
Exemple #16
0
        public CommandResults Parse(string command, IStringReader reader)
        {
            CommandContext contextBuilder = new CommandContext(reader.GetCursor());
            ParseResults   parseResults   = ParseNodes(Root, reader, contextBuilder);

            if (parseResults.Reader.CanRead())
            {
                if (parseResults.Errors.Count > 0)
                {
                    return(new CommandResults(false, parseResults.Errors[^ 1], parseResults.Context.Results));
Exemple #17
0
 public IEnumerable <Node> GetRelevantNodes(IStringReader reader)
 {
     if (Literals.Count > 0)
     {
         int start = reader.GetCursor();
         while (!reader.AtEndOfArgument())
         {
             reader.Skip();
         }
         string value = reader.GetString()[start..reader.GetCursor()];
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out StructureRotation result)
        {
            result = default;
            int start = reader.GetCursor();

            while (reader.CanRead() && IsUnquotedStringPart(reader.Peek()))
            {
                reader.Skip();
            }
            string structureRotation = reader.GetString()[start..reader.GetCursor()];
 private ReadResults CheckComponents(EntitySelectorParser parser, IStringReader reader, DispatcherResources resources)
 {
     if (Contents != null)
     {
         CommandContext context     = new CommandContext(reader.GetCursor());
         ReadResults    readResults = Contents.Parse(reader, context, resources);
         if (readResults.Successful)
         {
             parser.AddArgument(context.Results[0]);
         }
         return(readResults);
     }
     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 #21
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 #22
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());
        }
        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());
        }
        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 Component result)
        {
            result = default;
            if (!reader.CanRead())
            {
                return(ReadResults.Failure(CommandError.IncorrectArgument().WithContext(reader)));
            }
            int start = reader.GetCursor();

            ReadResults readResults = new JsonReader(reader).ReadAny(out IJsonArgument json);

            if (!readResults.Successful)
            {
                return(readResults);
            }
            result = new Component(json);
            return(new ComponentReader(reader, start, resources).ValidateFromRoot(json, resources.Components));
        }
        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 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());
        }
        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);
        }
        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)));
            }
        }
        public ReadResults Parse(IStringReader reader, DispatcherResources resources, out ScoreHolder result)
        {
            result = default;

            if (reader.CanRead() && reader.Peek() == '@')
            {
                EntitySelectorParser entitySelectorParser = new EntitySelectorParser(reader, resources, UseBedrock);
                ReadResults          readResults          = entitySelectorParser.Parse(out EntitySelector entitySelector);
                if (!readResults.Successful)
                {
                    return(readResults);
                }
                if (!Multiple && entitySelector.MaxResults > 1)
                {
                    return(ReadResults.Failure(CommandError.SelectorTooManyEntities()));
                }
                result = new ScoreHolder(null, entitySelector);
                return(ReadResults.Success());
            }

            if (UseBedrock)
            {
                ReadResults readResults = reader.ReadString(out string name);
                if (!readResults.Successful)
                {
                    return(readResults);
                }

                result = new ScoreHolder(name, null);
                return(ReadResults.Success());
            }
            else
            {
                int start = reader.GetCursor();
                while (!reader.AtEndOfArgument())
                {
                    reader.Skip();
                }
                string name = reader.GetString()[start..reader.GetCursor()];