convert method
Converts input and returns the result of the conversion.
Implementation
@override
CryptData convert(String input) {
if (input.isEmpty) {
throw FormatException('Empty string');
}
String id, val;
List<String> pair;
Iterable<String> parts;
String? version, salt, hash;
Map<String, String>? params;
parts = input.split(r'$');
if (parts.first.isNotEmpty) {
throw FormatException(r'Does not start with "$"');
}
parts = parts.skip(1);
id = parts.first;
parts = parts.skip(1);
if (parts.isNotEmpty) {
val = parts.first;
if (val.startsWith('v=')) {
version = val.substring(2);
parts = parts.skip(1);
}
}
if (parts.isNotEmpty) {
val = parts.first;
if (val.contains('=') || val.contains(',')) {
params = {};
for (final kv in parts.first.split(',')) {
pair = kv.split('=');
if (pair.length != 2) {
throw FormatException('Invalid parameter: "$kv"');
}
if (params.containsKey(pair[0])) {
throw FormatException('Duplicate parameter key: "${pair[0]}"');
}
params[pair[0]] = pair[1];
}
parts = parts.skip(1);
}
}
if (parts.isNotEmpty) {
salt = parts.first;
parts = parts.skip(1);
}
if (parts.isNotEmpty) {
hash = parts.first;
parts = parts.skip(1);
}
if (parts.isNotEmpty) {
throw FormatException('Extra characters at the end');
}
var data = CryptData(
id,
version: version,
salt: salt,
hash: hash,
params: params,
);
data.validate();
return data;
}