decode static method

CipherManifest? decode(
  1. String content
)

Implementation

static CipherManifest? decode(String content) {
  final signatureTimestamp =
      _signatureTimestampExp.firstMatch(content)?.group(1)?.nullIfWhitespace;

  if (signatureTimestamp == null) {
    return null;
  }

  final cipherCallSite =
      _cipherCallSiteExp.firstMatch(content)?.group(0)?.nullIfWhitespace;

  if (cipherCallSite == null) {
    return null;
  }

  final cipherContainerName = _cipherContainerNameExp
      .firstMatch(cipherCallSite)
      ?.group(1)
      ?.nullIfWhitespace;

  if (cipherContainerName == null) {
    return null;
  }

  final cipherDefinition =
      RegExp('var ${RegExp.escape(cipherContainerName)}={.*?};', dotAll: true)
          .firstMatch(content)
          ?.group(0)
          ?.nullIfWhitespace;

  if (cipherDefinition == null) {
    return null;
  }

  final swapFuncName = _swapFuncNameExp
      .firstMatch(cipherDefinition)
      ?.group(1)
      ?.nullIfWhitespace;
  final spliceFuncName = _spliceFuncNameExp
      .firstMatch(cipherDefinition)
      ?.group(1)
      ?.nullIfWhitespace;
  final reverseFuncName = _reverseFuncName
      .firstMatch(cipherDefinition)
      ?.group(1)
      ?.nullIfWhitespace;

  final ops = cipherCallSite
      .split(';')
      .map((e) {
        final calledFuncName =
            _calledFuncNameExp.firstMatch(e)?.group(1)?.nullIfWhitespace;
        if (calledFuncName == null) {
          return null;
        }
        if (calledFuncName == swapFuncName) {
          final index = _funcIndexExp.firstMatch(e)?.group(1).parseInt();
          return SwapCipherOperation(index!);
        }
        if (calledFuncName == spliceFuncName) {
          final index = _funcIndexExp.firstMatch(e)?.group(1).parseInt();
          return SpliceCipherOperation(index!);
        }
        if (calledFuncName == reverseFuncName) {
          return const ReverseCipherOperation();
        }
      })
      .whereNotNull()
      .toList();
  return CipherManifest(signatureTimestamp, ops);
}