import { NGBaseNode, NGNode } from "../ast-transform/node-types.js";

//#region src/microsyntax/microsyntax-node-types.d.ts
/**
 *     Microsyntax ::
 *       ( ( Exp | Let ) ( Sep? ( Let | As | KeyExp ) )* Sep? Key? )?
 *
 *     Sep ::
 *       ';'
 *       ','
 *
 *     Key ::
 *       StringLiteral
 *       Identifier ( '-' Identifier )*
 *
 *     Exp ::
 *       NGNode ( 'as' Key )?
 *
 *     KeyExp ::
 *       Key ':'? Exp
 *
 *     As ::
 *       Key 'as' Key
 *
 *     Let ::
 *       'let' Key ( '=' Key )?
 */
interface NGMicrosyntax extends NGBaseNode {
  type: 'NGMicrosyntax';
  body: (NGMicrosyntaxAs | NGMicrosyntaxExpression | NGMicrosyntaxKey | NGMicrosyntaxKeyedExpression | NGMicrosyntaxLet)[];
}
type NGMicrosyntaxNode = NGMicrosyntax | NGMicrosyntaxAs | NGMicrosyntaxExpression | NGMicrosyntaxKey | NGMicrosyntaxKeyedExpression | NGMicrosyntaxLet;
interface NGMicrosyntaxKey extends NGBaseNode {
  type: 'NGMicrosyntaxKey';
  name: string;
}
interface NGMicrosyntaxKeyedExpression extends NGBaseNode {
  type: 'NGMicrosyntaxKeyedExpression';
  key: NGMicrosyntaxKey;
  expression: NGMicrosyntaxExpression;
}
interface NGMicrosyntaxExpression extends NGBaseNode {
  type: 'NGMicrosyntaxExpression';
  expression: NGNode;
  alias: NGMicrosyntaxKey | null;
}
interface NGMicrosyntaxAs extends NGBaseNode {
  type: 'NGMicrosyntaxAs';
  key: NGMicrosyntaxKey;
  alias: NGMicrosyntaxKey;
}
interface NGMicrosyntaxLet extends NGBaseNode {
  type: 'NGMicrosyntaxLet';
  key: NGMicrosyntaxKey;
  value: NGMicrosyntaxKey | null;
}
//#endregion
export { NGMicrosyntax, NGMicrosyntaxAs, NGMicrosyntaxExpression, NGMicrosyntaxKey, NGMicrosyntaxKeyedExpression, NGMicrosyntaxLet, NGMicrosyntaxNode };