buildAdiString method

String buildAdiString({
  1. NonAsciiBuildOption nonAsciiFallback = NonAsciiBuildOption.throwError,
})

Build the ADI string.

Implementation

String buildAdiString({
  NonAsciiBuildOption nonAsciiFallback = NonAsciiBuildOption.throwError,
}) {
  final userdefs = _getValidatedUserdefMetaList(data);
  final userdefIds = <String, int>{
    for (var i = 0; i < userdefs.length; i++) userdefs[i].name: i + 1,
  };
  final lines = <String>[];

  lines.add(_formatAdiField('ADIF_VER', adifVer));
  if (createdTimestamp != null) {
    lines.add(
      _formatAdiField(
        'CREATED_TIMESTAMP',
        _formatAdiTimestamp(createdTimestamp!),
      ),
    );
  }
  if (programid != null) {
    lines.add(_formatAdiField('PROGRAMID', programid!));
  }
  if (programversion != null) {
    lines.add(_formatAdiField('PROGRAMVERSION', programversion!));
  }

  for (var i = 0; i < userdefs.length; i++) {
    final userdef = userdefs[i];
    final payload = _formatUserdefPayload(userdef);
    lines.add(
      _formatAdiField('USERDEF${i + 1}', payload, type: userdef.type),
    );
  }

  lines.add('<EOH>');

  for (final qso in data) {
    for (final adifField in qso.adifdefs) {
      final prepared = _prepareAdifFieldForAdi(adifField, nonAsciiFallback);
      if (prepared == null) {
        continue;
      }
      lines.add(_formatAdiField(prepared.fieldName, prepared.value));
    }

    for (final appField in qso.appdefs) {
      if (appField.value is AdifEnumeration || appField.value is AdifRange) {
        throw ArgumentError(
          'APP field ${appField.fieldName} requires auxiliary metadata that ADI does not carry',
        );
      }

      _validateAppNameComponent(
        appField.programid,
        label: 'APP programid',
        allowUnderscore: false,
      );
      _validateAppNameComponent(
        appField.fieldName,
        label: 'APP field name',
        allowUnderscore: true,
      );

      final prepared = _prepareCustomFieldForAdi(
        appField.value,
        nonAsciiFallback,
      );
      if (prepared == null) {
        continue;
      }

      lines.add(
        _formatAdiField(
          '$_adiAppPrefix${appField.programid}_${appField.fieldName}',
          prepared.value,
          type: prepared.type,
        ),
      );
    }

    for (final userField in qso.userdefs) {
      final fieldId =
          userdefIds[userField.fieldName] ??
          (throw ArgumentError(
            'USERDEF metadata missing for ${userField.fieldName}',
          ));
      final prepared = _prepareCustomFieldForAdi(
        userField.value,
        nonAsciiFallback,
      );
      if (prepared == null) {
        continue;
      }

      lines.add(
        _formatAdiField(
          'USERDEF$fieldId',
          prepared.value,
          type: prepared.type,
        ),
      );
    }

    lines.add('<EOR>');
  }

  return '${lines.join('\n')}\n';
}