using Jtr.Parsing; namespace Jtr.Tools; // See https://docs.hevodata.com/sources/engg-analytics/streaming/rest-api/writing-jsonpath-expressions/ public static partial class JsonPath { public interface IJsonPathSyntax { public Lexer.Token Token { get; } } public readonly struct WildCardSyntax : IJsonPathSyntax { public Lexer.Token Token { get; } public WildCardSyntax(Lexer.Token token) { Token = token; } } public readonly struct ArrayIndexSyntax : IJsonPathSyntax { public Lexer.Token Token { get; } public Lexer.Token Index { get; } public int IndexAsInt => int.Parse(Token.Lexeme); public ArrayIndexSyntax(Lexer.Token token, Lexer.Token index) { Token = token; Index = index; } } public readonly struct ArrayIndexListSyntax : IJsonPathSyntax { public Lexer.Token Token { get; } public Lexer.Token[] Indices { get; } public int ValueAt(int index) => int.Parse(Indices[index].Lexeme); public ArrayIndexListSyntax(Lexer.Token token, Lexer.Token[] indices) { Token = token; Indices = indices; } } public readonly struct ObjectIndexSyntax : IJsonPathSyntax { public Lexer.Token Token { get; } public Lexer.Token Index { get; } public ObjectIndexSyntax(Lexer.Token token, Lexer.Token index) { Token = token; Index = index; } } public readonly struct ObjectIndexListSyntax : IJsonPathSyntax { public Lexer.Token Token { get; } public Lexer.Token[] Indexes { get; } public ObjectIndexListSyntax(Lexer.Token token, Lexer.Token[] indexes) { Token = token; Indexes = indexes; } } public readonly struct PropertyAccessorSyntax : IJsonPathSyntax { public Lexer.Token Token { get; } public IJsonPathSyntax Getter { get; } public PropertyAccessorSyntax(Lexer.Token token, IJsonPathSyntax getter) { Token = token; Getter = getter; } } public readonly struct PropertySyntax : IJsonPathSyntax { public Lexer.Token Token { get; } public PropertySyntax(Lexer.Token token) { Token = token; } } }