import { FormatScanner, TokeType } from "./FormatScanner"; import { isNullOrEmptyString } from "../safe"; import { TextWriter } from "../interfaces"; export class FormatCompiler { _scanner: FormatScanner; _parts: []; compile() { return (writer: TextWriter, args: any) => { this._parts.forEach(x => writer.WriteValue(x)) }; } visitText() { while (this._scanner.next()) { switch (this._scanner.getTokenType()) { case TokeType.CurlOpen: this.visitCurlOpen(); break; case TokeType.CurlClose: this.visitCurlClose(); break; default: this.pushText(this._scanner.getTokenValue()); } if (this._scanner.getTokenType() === TokeType.CurlOpen) this.visitCurlOpen(); } } visitCurlClose() { if (!this._scanner.next()) this.dieUnexpectedEnd("}"); if (this._scanner.getTokenType() !== TokeType.CurlClose) this.dieUnexpectedToken("}"); this.pushText("}"); } visitCurlOpen() { if (this._scanner.next()) { if (this._scanner.getTokenType() === TokeType.CurlOpen) this.pushText("{"); else this.visitTemplateSubst(); } } visitTemplateSubst() { if (this._scanner.getTokenType() !== TokeType.Text) this.dieUnexpectedToken("TEXT"); const fieldName = this._scanner.getTokenValue(); const filedFormat = this.readColon() && this.readFieldFormat(); this.pushSubst(fieldName, filedFormat); } readFieldFormat() { const parts = new Array(); while (this._scanner.next()) { if (this._scanner.getTokenType() === TokeType.CurlClose) { return parts.join(""); } else { parts.push(this._scanner.getTokenValue()); } } this.dieUnexpectedEnd("}"); } readColon() { if (!this._scanner.next()) this.dieUnexpectedEnd(); if (this._scanner.getTokenType() !== TokeType.Colon) return false; if (!this._scanner.next()) this.dieUnexpectedEnd(); return true; } pushSubst(fieldName: string, filedFormat: string) { } pushText(text: string) { } dieUnexpectedToken(expected?: string) { throw new Error(isNullOrEmptyString(expected) ? `Unexpected token ${this._scanner.getTokenValue()}` : `Unexpected token ${this._scanner.getTokenValue()}, expected ${expected}` ); } dieUnexpectedEnd(expected?: string) { throw new Error(isNullOrEmptyString(expected) ? "Unexpected end of the string" : `Unexpected end of the string, expected ${expected}`); } }