import {BaseApiDocGenerator} from "../domain/BaseApiDocGenerator"; import SourceCode from "../../codeGen/domain/SourceCode"; import ApiSchema from "../../schemeGenerator/domain/ApiSchema"; import {Type} from "../../codeGen/domain/types/Type"; import NumberType from "../../codeGen/domain/types/NumberType"; import StringType from "../../codeGen/domain/types/StringType"; import CustomType from "../../codeGen/domain/types/CustomType"; import BooleanType from "../../codeGen/domain/types/BooleanType"; import VectorType from "../../codeGen/domain/types/VectorType"; import TypescriptCodeGenerator from "../../codeGen/infrastructure/TypescriptCodeGenerator"; import JavaScriptCodeGenerator from "../../codeGen/infrastructure/JavaScriptCodeGenerator"; import SwiftCodeGenerator from "../../codeGen/infrastructure/SwiftCodeGenerator"; export default class ApiDocGenerator implements BaseApiDocGenerator { private tsCodeGenerator = new TypescriptCodeGenerator() private jsCodeGenerator = new JavaScriptCodeGenerator() private swiftCodeGenerator = new SwiftCodeGenerator() public generateApiDoc(scheme: ApiSchema, schemeVersion: number): SourceCode { let code = new SourceCode() code.add('') code.add('') code.add(``) code.add(``) code.add(` `) code.add(`V${schemeVersion} API Docs`) code.add('') code.add('
') code.add('
') code.add('
') code.add('
') code.add(`

API Docs

`) code.add(`

Scheme version: ${schemeVersion}, Generated at ${(new Date()).toString()}

`) code.add(`
`) code.add('

Methods

') for (let method of scheme.methods) { code.add('
') code.add(`
${method.name}
`) code.add('
') code.add(`

/${method.name}

`) code.add('') code.add('') code.add('') code.add('') code.add('') code.add('') code.add('') code.add('') for (let param of method.params) { code.add('') code.add(``) code.add(``) code.add('') } code.add('') code.add('
ParamType
${param.name}${this.renderType(param.type)}
') let responseType = scheme.responses.find(r => r.name == (method.responseType as CustomType).name ) if (!responseType) throw new Error('Cant find response type' + (method.responseType as CustomType).name) code.add(`

Response: ${responseType.name}

`) code.add('') code.add('') code.add('') code.add('') code.add('') code.add('') code.add('') code.add('') for (let param of responseType.fields) { code.add('') code.add(``) code.add(``) code.add('') } code.add('') code.add('
FieldType
${param.name}${this.renderType(param.type)}
') code.add('
') code.add('
') } code.add('

Models

') for (let model of scheme.models) { code.add(`
`) code.add(`
${model.name}
`) code.add('
') code.add(`

${model.name}

`) code.add('') code.add('') code.add('') code.add('') code.add('') code.add('') code.add('') code.add('') for (let param of model.fields) { code.add('') code.add(``) code.add(``) code.add('') } code.add('') code.add('
ParamType
${param.name}${this.renderType(param.type)}
') let tsModelCode = new SourceCode() tsModelCode.add('
')
            tsModelCode.add(this.tsCodeGenerator.generateClass(model).render())
            tsModelCode.add('
') code.append(this.createCollapsablePanel('TS model code', tsModelCode)) let jsModelCode = new SourceCode() jsModelCode.add('
')
            jsModelCode.add(this.jsCodeGenerator.generateClass(model).render())
            jsModelCode.add('
') code.append(this.createCollapsablePanel('JS model code', jsModelCode)) let swiftModelCode = new SourceCode() swiftModelCode.add('
')
            swiftModelCode.add(this.swiftCodeGenerator.generateClass(model).render())
            swiftModelCode.add('
') code.append(this.createCollapsablePanel('Swift model code', swiftModelCode)) code.add('
') code.add('
') } code.add('
') code.add('
') code.add('
') code.add('
') code.add('') return code } private renderType(type: Type): string { if (type instanceof NumberType) return 'number' else if (type instanceof StringType) return 'string' else if (type instanceof CustomType) return `${type.name}` else if (type instanceof BooleanType) return 'bool' else if (type instanceof VectorType) return this.renderType(type.item) + '[ ]' throw new Error('Unknown type') } private createCollapsablePanel(name: string, content: SourceCode): SourceCode { let code = new SourceCode() let randomId = Math.random().toString(16).replace('.', '') code.add('
') code.add('
') code.add('
') code.add('

') code.add(`${name}`) code.add('

') code.add('
') code.add(`
`) code.add('
') code.append(content) code.add('
') code.add('
') code.add('
') code.add('
') return code } }