convert method

  1. @override
CryptData convert(
  1. String input
)
override

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;
}