interfaceFile function

DartFile interfaceFile(
  1. ClientServer server,
  2. String formatter(
    1. Spec
    )
)

Implementation

DartFile interfaceFile(ClientServer server, String Function(Spec) formatter) {
  final imports = server.allImports(
    additionalPackages: [
      'package:revali_client/revali_client.dart',
      if (server.hasWebsockets)
        'package:web_socket_channel/web_socket_channel.dart',
    ],
  );

  final typedefs = [
    if (server.hasWebsockets)
      TypeDef(
        (b) => b
          ..name = 'WebSocketConnect'
          ..definition = CodeExpression(
            Block.of([
              refer('WebSocketChannel').code,
              FunctionType(
                (b) => b
                  ..requiredParameters.addAll([
                    TypeReference((b) => b..symbol = 'Uri'),
                  ])
                  ..namedParameters.addAll({
                    'protocols': TypeReference(
                      (b) => b
                        ..symbol = 'Iterable'
                        ..isNullable = true
                        ..types.add(refer('String')),
                    ),
                  }),
              ).code,
            ]),
          ),
      ),
  ].map(formatter).join('\n');

  return DartFile(
    basename: 'interfaces',
    content:
        '''
$imports
export 'package:revali_client/src/storage.dart';
$typedefs
''',
    parts: [
      for (final controller in server.controllers)
        if (!controller.isExcluded)
          controllerInterfaceFile(controller, formatter),
    ],
    segments: ['lib'],
  );
}