Add service client support
This commit is contained in:
@ -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"));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user