generate method

Future<void> generate({
  1. required String path,
  2. required String target,
})

This is entrypoint for code generation. Generates code according to the SteamApi definition by traversing all fields and emitting necessary code

Implementation

Future<void> generate({
  required String path,
  required String target,
}) async {
  List<SteamStruct> missingStructs = [
    SteamStruct(name: "SteamDatagramRelayAuthTicket"),
    SteamStruct(
      name: "CallbackMsg_t",
      fields: [
        SteamField(
          name: "m_hSteamUser",
          type: "HSteamUser",
        ),
        SteamField(
          name: "m_iCallback",
          type: "int",
        ),
        SteamField(
          name: "m_pubParam",
          type: "uint8 *",
        ),
        SteamField(
          name: "m_cubParam",
          type: "int",
        ),
      ],
    ),
    SteamStruct(
      name: "AnalogAction_t",
      fields: [
        SteamField(
          name: "actionHandle",
          type: "InputAnalogActionHandle_t",
        ),
        SteamField(
          name: "analogActionData",
          type: "InputAnalogActionData_t",
        ),
      ],
    ),
  ];

  List<SteamInterface> missingInterfaces = [
    SteamInterface(name: "ISteamNetworkingConnectionSignaling"),
    SteamInterface(name: "ISteamNetworkingSignalingRecvContext"),
  ];

  Set<String> enumSet = enums.map((e) => e.name).toSet();
  enumSet.addAll(structs.expand((s) => s.enums.map((e) => e.name)));
  enumSet.addAll(callbackStructs.expand((cs) => cs.enums.map((e) => e.name)));
  enumSet.addAll(interfaces.expand((i) => i.enums.map((e) => e.name)));

  Set<String> structSet = structs.map((s) => s.name).toSet()
    ..addAll(missingStructs.map((s) => s.name));

  Set<String> callbackStructSet =
      callbackStructs.map((cs) => cs.name).toSet();

  Set<String> interfaceSet = interfaces.map((i) => i.name).toSet()
    ..addAll(missingInterfaces.map((i) => i.name));

  String exportFilePath = p.join(path, "generated.dart");
  File file = File(exportFilePath);
  await file.create(recursive: true);

  IOSink exportSink = file.openWrite(mode: FileMode.writeOnly);

  await generateCallbackIdMap(
    path: path,
    exportSink: exportSink,
    callbackStructSet: callbackStructSet,
  );

  await generateDl(
    path: path,
  );
  await generateSteamApi(
    path: path,
    exportSink: exportSink,
    enumSet: enumSet,
    structSet: structSet,
    callbackStructSet: callbackStructSet,
  );
  await generateSteamGameServer(
    path: path,
    exportSink: exportSink,
    enumSet: enumSet,
    structSet: structSet,
    callbackStructSet: callbackStructSet,
  );
  await generateDispatch(
    path: path,
    exportSink: exportSink,
    enumSet: enumSet,
    structSet: structSet,
    callbackStructSet: callbackStructSet,
  );
  await generateUnknownEnumValueException(
    path: path,
    exportSink: exportSink,
  );
  await consts.generateFile(
    path: path,
    exportSink: exportSink,
  );
  await typedefs.generateFile(
    path: path,
    exportSink: exportSink,
  );
  await enums.generateFile(
    path: path,
    exportSink: exportSink,
  );
  await missingStructs.generateFile(
    path: path,
    exportSink: exportSink,
    target: target,
    enumSet: enumSet,
    structSet: structSet,
    callbackStructSet: callbackStructSet,
  );
  await structs.generateFile(
    path: path,
    exportSink: exportSink,
    target: target,
    enumSet: enumSet,
    structSet: structSet,
    callbackStructSet: callbackStructSet,
  );
  await callbackStructs.generateFile(
    path: path,
    exportSink: exportSink,
    target: target,
    enumSet: enumSet,
    structSet: structSet,
    callbackStructSet: callbackStructSet,
  );

  await missingInterfaces.generateFile(
    path: path,
    exportSink: exportSink,
    enumSet: enumSet,
    structSet: structSet,
    callbackStructSet: callbackStructSet,
    interfaceSet: interfaceSet,
  );
  await interfaces.generateFile(
    path: path,
    exportSink: exportSink,
    enumSet: enumSet,
    structSet: structSet,
    callbackStructSet: callbackStructSet,
    interfaceSet: interfaceSet,
  );

  await exportSink.flush();
  await exportSink.close();
}