generateDataClassFile method

String generateDataClassFile({
  1. SquintGeneratorOptions options = standardSquintGeneratorOptions,
})

Generate data class from CustomType.

{@category generator}

Implementation

String generateDataClassFile({
  SquintGeneratorOptions options = standardSquintGeneratorOptions,
}) {
  final buffer = StringBuffer()..write("""
    |// Copyright (c) 2021 - 2023 Buijs Software
    |//
    |// Permission is hereby granted, free of charge, to any person obtaining a copy
    |// of this software and associated documentation files (the "Software"), to deal
    |// in the Software without restriction, including without limitation the rights
    |// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    |// copies of the Software, and to permit persons to whom the Software is
    |// furnished to do so, subject to the following conditions:
    |//
    |// The above copyright notice and this permission notice shall be included in all
    |// copies or substantial portions of the Software.
    |//
    |// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    |// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    |// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    |// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    |// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    |// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    |// SOFTWARE.
    |
    |import 'package:squint_json/squint_json.dart';
    |""");

  final unwrapped =
      unwrapNestedTypes(members.map((e) => e.type).toList()).toSet();

  final enums = unwrapped.whereType<EnumType>().toSet();

  final customs = unwrapped.whereType<CustomType>().toSet();

  if (options.includeCustomTypeImports && !options.generateChildClasses) {
    importStatements(Set<AbstractType>.of(unwrapped)
          ..addAll(enums)
          ..addAll(customs))
        .forEach(buffer.write);
  }

  buffer.write("""
      /// Autogenerated data class by Squint.
      ${generateDataClassBody(options)}""");

  /// If generateChildClasses is set to false
  /// then skip code generation for TypeMember CustomTypes/EnumTypes.
  if (options.generateChildClasses) {
    for (final ct in customs.toSet()) {
      buffer.write(ct.generateDataClassBody(options));
    }

    for (final et in enums.toSet()) {
      buffer.write(et.generateEnumClassBody(options));
    }
  }

  final toBeEncoded = members.where((element) {
    return element.type is CustomType || element.type is EnumType;
  }).map((element) {
    final name = element.name;
    final annotations = element.annotations;
    final type = element.type;
    if (type is CustomType) {
      return TypeMember(
        name: name,
        type: customs
            .firstWhere((element) => element.className == type.className),
        annotations: annotations,
      );
    }
    if (type is EnumType) {
      return TypeMember(
        name: name,
        type: enums
            .firstWhere((element) => element.className == type.className),
        annotations: annotations,
      );
    }

    throw SquintException("Unknown data type: $type");
  }).toList();

  for (final ct in toBeEncoded) {
    buffer
      ..write(ct.encodingMethodBody)
      ..write(ct.decodingMethodBody);
  }

  return buffer.toString().formattedDartCode;
}