Persister listPersister()

in util/base/src/main/java/jetbrains/jetpad/base/Persisters.java [182:244]


  Persister<ListT> listPersister(final Persister<T> itemPersister, final Supplier<ListT> empty) {
    return new Persister<ListT>() {
      @Override
      public ListT deserialize(String value) {
        boolean error = false;
        ListT result = empty.get();
        if (value == null) {
          return result;
        }
        while (!value.isEmpty()) {
          if (value.charAt(0) == 'n') {
            result.add(null);
            value = value.substring(1);
          } else {
            int numSize = 0;
            while (numSize < value.length() && Character.isDigit(value.charAt(numSize))) {
              numSize += 1;
            }
            if (numSize < 1) {
              error = true;
              break;
            }
            int len = Integer.parseInt(value.substring(0, numSize));
            if (value.length() < numSize + 1 + len) {
              error = true;
              break;
            }
            value = value.substring(numSize + 1);
            result.add(itemPersister.deserialize(value.substring(0, len)));
            value = value.substring(len);
          }
        }
        if (error) {
          return empty.get();
        } else {
          return result;
        }
      }

      @Override
      public String serialize(ListT value) {
        if (value == null) {
          return null;
        }
        StringBuilder result = new StringBuilder();
        for (T item : value) {
          String serialized = itemPersister.serialize(item);
          // Almost Netstring with 'n' for null
          if (serialized == null) {
            result.append('n');
          } else {
            result.append(serialized.length()).append(':').append(serialized);
          }
        }
        return result.toString();
      }

      @Override
      public String toString() {
        return "listPersister[using = " + itemPersister + "]";
      }
    };
  }