enrichTemplate function

String enrichTemplate({
  1. required String className,
  2. required List<ParameterElement> required,
  3. required List<ParameterElement> optional,
  4. required List<ParameterElement> named,
  5. required String? accesorName,
})

Implementation

String enrichTemplate({
  required String className,
  required List<ParameterElement> required,
  required List<ParameterElement> optional,
  required List<ParameterElement> named,
  required String? accesorName,
}) {
  final all = required.followedBy(optional).followedBy(named).toList();
  final positional = required.followedBy(optional).toList();
  final String baseName = '_\$${className}Base';
  final String dataHolderName = '_\$$className';
  // final String providerName = accesorName ?? '_Theme';

  return '''
abstract class $baseName implements ThemeBase<$dataHolderName> {
  /* ALL \${e.type} get \${e.name}; */
  ${all.map((e) => '${e.type} get ${e.name};').join('\n')}

  const $baseName();
  $dataHolderName combine($dataHolderName? other) {
    if (other == null) return this as $dataHolderName;
    return $dataHolderName(
      /* POSITIONAL other.\${e.name} ?? \${e.name}, */
      ${positional.map((e) => 'other.${e.name} ?? ${e.name},').join('')}
      /* NAMED \${e.name}: other.\${e.name} ?? \${e.name},*/
      ${named.map((e) => '${e.name}: other.${e.name} ?? ${e.name},').join('')}
    );
  }

  Map<String, dynamic> toJson();
}

@JsonSerializable(includeIfNull: true)
${all.map((e) => converters[e.type.toString()]).where((e) => e != null).toSet().join('\n')}
class $dataHolderName extends $className {
  /* ALL final \${e.type} \${e.name}; */
  ${all.map((e) => '${e.metadata.map((e) => e.toSource()).join(' ')} final ${e.type} ${e.name};').join('\n')}


  const $dataHolderName(
    /* REQUIRED this.\${e.name}, */
    ${required.map((e) => 'this.${e.name},').join('')}
    /* OPTIONAL [
      this.\${e.name},
    ]*/
    ${optional.isEmpty ? '' : '[${optional.map((e) => 'this.${e.name},').join('')}]'}
    /* NAMED {
      this.\${e.name},
    } */
    ${named.isEmpty ? '' : '{${named.map((e) => 'this.${e.name},').join('')}}'}
  ) : super._();

  Map<String, dynamic> toJson() => _\$\$${className}ToJson(this);
}
''';
}