package io.github.lonamiwebs.overgram.parser; import io.github.lonamiwebs.overgram.utils.CharacterIterator; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class TLReader { public static final Map> readTlObjects(final File file) { final Map> result = new HashMap<>(); for (final Map.Entry> entry : readTl(file).entrySet()) { final List objects = new ArrayList<>(); for (final String string : entry.getValue()) { objects.add(TLObject.fromString(string)); } result.put(entry.getKey(), objects); } return result; } private static Map> readTl(final File file) { final Map> result = new HashMap<>(); String section = "types"; try (final CharacterIterator iter = new CharacterIterator(new FileReader(file))) { String tmp; final StringBuilder builder = new StringBuilder(); for (char c : iter) { switch (c) { // Assume '/' only occurs in "// comments...\n" case '/': do { c = iter.next(); } while (iter.hasNext() && c != '\n'); break; // Assume '-' only occurs in "---sections---\n" case '-': if (builder.length() != 0) { tmp = builder.toString().trim(); if (!tmp.isEmpty()) { result.computeIfAbsent(section, k -> new ArrayList<>()).add(tmp); } builder.setLength(0); } do { c = iter.next(); if (c != '-') { builder.append(c); } } while (iter.hasNext() && c != '\n'); section = builder.toString().trim(); builder.setLength(0); break; // Definitions are separated by ';' case ';': tmp = builder.toString().trim(); if (!tmp.isEmpty()) { result.computeIfAbsent(section, k -> new ArrayList<>()).add(tmp); } builder.setLength(0); break; default: builder.append(c); break; } } } catch (IOException ignored) { } return result; } }