buildAdiString method
- 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';
}