Add service client support

This commit is contained in:
2022-07-21 18:33:23 +02:00
parent 327d7dfac6
commit 1774306b06
6 changed files with 338 additions and 46 deletions

View File

@ -10,7 +10,7 @@ const conversion = {
float: "double",
string: "String",
void: "void",
bytes: "Uint8List", //TODO: Check this
// bytes: "Uint8List", //TODO: Check this
};
function toDartType(type: string): string {
@ -35,11 +35,20 @@ export class DartTarget extends CompileTarget<{ dart_library_name: string }> {
}
generateImports(a: lineAppender, def: TypeDefinition | ServiceDefinition) {
a(0, `import "./base.dart";`)
def.depends.forEach((dep) => {
a(0, this.getImport(dep));
});
}
getTypeParse(type: string, value: string) {
if (conversion[type]) {
return `${toDartType(type)}_fromJson(${value})`;
} else {
return `${toDartType(type)}.fromJson(${value})`;
}
}
generateType(definition: TypeDefinition): void {
const { a, getResult } = LineAppender();
@ -53,8 +62,7 @@ export class DartTarget extends CompileTarget<{ dart_library_name: string }> {
} else if (field.map) {
a(
1,
`Map<${toDartType(field.map)},${toDartType(field.type)}>? ${
field.name
`Map<${toDartType(field.map)},${toDartType(field.type)}>? ${field.name
};`
);
} else {
@ -74,18 +82,10 @@ export class DartTarget extends CompileTarget<{ dart_library_name: string }> {
for (const field of definition.fields) {
a(2, `if(json.containsKey("${field.name}")) {`);
const parseField = (value: string) => {
if (conversion[field.type]) {
return value;
} else {
return `${field.type}.fromJson(${value})`;
}
};
if (field.array) {
a(3, `this.${field.name} = [];`);
a(3, `(json["${field.name}"] as List<dynamic>).forEach((e) => {`);
a(4, `this.${field.name}!.add(${parseField("e")})`);
a(4, `this.${field.name}!.add(${this.getTypeParse(field.type, "e")})`);
a(3, `});`);
} else if (field.map) {
a(3, `this.${field.name} = {};`);
@ -95,12 +95,12 @@ export class DartTarget extends CompileTarget<{ dart_library_name: string }> {
field.map
)},dynamic>).forEach((key, value) => {`
);
a(4, `this.${field.name}![key] = ${parseField("value")}`);
a(4, `this.${field.name}![key] = ${this.getTypeParse(field.type, "value")}`);
a(3, `});`);
} else {
a(
3,
`this.${field.name} = ${parseField(`json["${field.name}"]`)};`
`this.${field.name} = ${this.getTypeParse(field.type, `json["${field.name}"]`)};`
);
}
a(2, `} else {`);
@ -178,40 +178,102 @@ export class DartTarget extends CompileTarget<{ dart_library_name: string }> {
this.writeFile(`lib/src/${definition.name}.dart`, getResult());
}
generateService(definition: ServiceDefinition): void {
generateServiceClient(definition: ServiceDefinition): void {
const { a, getResult } = LineAppender();
this.generateImports(a, definition);
a(0, `import "./service_client.dart";`);
a(0, ``);
a(0, `class ${definition.name}Client extends Service {`);
a(0, ``);
a(1, `${definition.name}Client(ServiceProvider provider):super(provider, "${definition.name}");`);
a(0, ``);
for (const func of definition.functions) {
const args = func.inputs.map(inp =>
(inp.array ? `List<${toDartType(inp.type)}>` : toDartType(inp.type)) + " " + inp.name
).join(", ");
const asParams = func.inputs.map(e => e.name).join(", ");
if (!func.return) {
a(1, `void ${func.name}(${args}) {`)
a(2, `provider.sendNotification("${definition.name}.${func.name}", [${asParams}]);`);
a(1, `}`);
} else {
const baseReturnType = func.return.type != "void" ? (toDartType(func.return.type) + "?") : toDartType(func.return.type);
const returnType = func.return.array ? `List<${baseReturnType}>` : baseReturnType;
a(1, `Future<${returnType}> ${func.name}(${args}) async {`);
a(2, `var res = await this.provider.sendRequest("${definition.name}.${func.name}", [${asParams}]);`);
if (func.return.type !== "void") {
if(func.return.array) {
a(2, `return res.map((entry) =>${this.getTypeParse(func.return.type, "entry")}).toList();`);
} else {
a(2, `return ${this.getTypeParse(func.return.type, "res")};`);
}
}
a(1, `}`);
}
a(0, ``);
}
a(0, `}`);
a(0, ``);
this.writeFile(`lib/src/${definition.name}Client.dart`, getResult());
}
generateServiceServer(definition: ServiceDefinition): void {
console.log(
chalk.yellow("[DART] WARNING:"),
"DART support for services is not yet there. Service generation is skipped!"
"DART support for services is not yet there. Service generation is currently limited to clients!"
);
}
generateService(definition: ServiceDefinition): void {
this.generateServiceClient(definition);
this.writeFile("lib/src/service_client.dart", this.getTemplate("Dart/service_client.dart"))
}
finalize(steps: Step[]): void {
const { a, getResult } = LineAppender();
const { a, getResult } = LineAppender();
a(0, `library ${this.options.dart_library_name};`)
a(0, ``);
a(0, `library ${this.options.dart_library_name};`)
a(0, ``);
steps.forEach(([type, def]) => {
switch (type) {
case "type":
a(0, `export 'src/${def.name}.dart';`);
break;
case "enum":
a(0, `export 'src/${def.name}.dart';`);
break;
default:
console.warn(
chalk.yellow("[DART] WARNING:"),
"unimplemented step found:",
type
);
// case "service":
}
});
let hasService = false;
this.writeFile(`lib/${this.options.dart_library_name}.dart`, getResult());
this.writeFile(`pubspec.yaml`, this.getTemplate("Dart/pubspec.yaml").replace("__NAME__", this.options.dart_library_name));
}
steps.forEach(([type, def]) => {
switch (type) {
case "type":
a(0, `export 'src/${def.name}.dart';`);
break;
case "enum":
a(0, `export 'src/${def.name}.dart';`);
break;
case "service":
a(0, `export 'src/${def.name}Client.dart';`);
hasService = true;
break;
default:
console.warn(
chalk.yellow("[DART] WARNING:"),
"unimplemented step found:",
type
);
}
});
if (hasService) {
a(0, `export 'src/service_client.dart';`)
}
this.writeFile(`lib/${this.options.dart_library_name}.dart`, getResult());
this.writeFile(`pubspec.yaml`, this.getTemplate("Dart/pubspec.yaml").replace("__NAME__", this.options.dart_library_name));
this.writeFile(`lib/src/base.dart`, this.getTemplate("Dart/base.dart"));
}
}