import 'package:libac_flutter/nbt/Stream.dart'; import 'package:libac_flutter/nbt/Tag.dart'; import 'package:libac_flutter/nbt/impl/CompoundTag.dart'; import 'package:libac_flutter/utils/Converter.dart'; class NbtIo { static ByteLayer _io = ByteLayer(); // Handle various helper functions here! static Future _read(String file) async { _io = ByteLayer(); await _io.readFromFile(file); } // This function will read the file and check if it is infact gzipped static Future read(String file) async { await _read(file); if (_io.readByte() == TagType.Compound.byte) { _io.resetPosition(); return Tag.readNamedTag(_io) as CompoundTag; } else { // Is likely gzip compressed return readCompressed(file); } } static Future readCompressed(String file) async { _io = ByteLayer(); await _io.readFromFile(file); await _io.decompress(); _io.resetPosition(); return Tag.readNamedTag(_io) as CompoundTag; } static Future write(String file, CompoundTag tag) async { _io = ByteLayer(); Tag.writeNamedTag(tag, _io); await _io.writeToFile(file); } static Future writeCompressed(String file, CompoundTag tag) async { _io = ByteLayer(); Tag.writeNamedTag(tag, _io); await _io.compress(); await _io.writeToFile(file); } static ByteLayer getStream() { return _io; } static Future writeBase64String(CompoundTag tag) async { _io = ByteLayer(); Tag.writeNamedTag(tag, _io); _io.compress(); return base64Encoder.encode(_io.bytes); } static Future readBase64String(String encoded) async { _io = ByteLayer(); List bytes = base64Encoder.decode(encoded); for (int byte in bytes) { _io.writeByte(byte); } _io.decompress(); _io.resetPosition(); return Tag.readNamedTag(_io) as CompoundTag; } }