import { AbstractNode, Cursor, TemplateElement, keyword } from "abstract-lang"; import { Expression, Operand } from "../expression"; import { Name } from "../base"; export interface SetConfigRow { session?: boolean; local?: boolean; key: string; value: Operand; } export class SetConfig extends AbstractNode { static entry(cursor: Cursor): boolean { return cursor.beforeWord("set"); } static parse(cursor: Cursor): SetConfigRow { cursor.readWord("set"); let session = false; let local = false; if ( cursor.beforeWord("session") ) { cursor.readWord("session"); session = true; } else if ( cursor.beforeWord("local") ) { cursor.readWord("local"); local = true; } if ( cursor.beforePhrase("time", "zone") ) { cursor.readPhrase("time", "zone"); const key = "time zone"; const value = cursor.parse(Expression).operand(); return {session, local, key, value}; } const key = cursor.parse(Name).toString(); cursor.skipSpaces(); if ( cursor.beforeWord("to") ) { cursor.readWord("to"); } else { cursor.readValue("="); cursor.skipSpaces(); } const value = cursor.parse(Expression).operand(); return {session, local, key, value}; } template(): TemplateElement[] { const set = this.row; const output: TemplateElement[] = [ keyword("set") ]; if ( set.session ) { output.push(keyword("session")); } else if ( set.local ) { output.push(keyword("local")); } if ( set.key === "time zone" ) { output.push( keyword("time"), keyword("zone") ); } else { output.push(set.key); output.push(keyword("to")); } output.push(set.value); return output; } }