Skip to content

Commit

Permalink
RootTag Default Ideas
Browse files Browse the repository at this point in the history
```ts
type Compound = { [name: string]: boolean; };
type CompoundLike = object;

declare function read<T extends CompoundLike = Compound>(data: Uint8Array): Promise<T>;
```

Idea: Widen the scope of the generic parameter to allow more values which the user might like to pass in, but default to the more explicit value to check against! :D

#19
#28
#29
#32
  • Loading branch information
Offroaders123 committed Sep 13, 2023
1 parent 7c13898 commit 20e6ce7
Show file tree
Hide file tree
Showing 6 changed files with 18 additions and 18 deletions.
4 changes: 2 additions & 2 deletions src/bin/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { readFile } from "node:fs/promises";
import { read, write, parse, stringify, NBTData } from "../index.js";
import { file, snbt, pipe, name, endian, compression, bedrockLevel } from "./args.js";

import type { RootTagLike } from "../index.js";
import type { RootTag } from "../index.js";

// console.log({ name, endian, compression, bedrockLevel });

Expand All @@ -15,7 +15,7 @@ if (file === undefined){

const input = await readFile(file);

const data: RootTagLike | NBTData = extname(file) === ".snbt" ? parse(input.toString()) : await read(input);
const data: RootTag | NBTData = extname(file) === ".snbt" ? parse(input.toString()) : await read(input);

const nbt: NBTData = new NBTData(data,{ name, endian, compression, bedrockLevel });
if (!pipe){
Expand Down
4 changes: 2 additions & 2 deletions src/format.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Int32 } from "./primitive.js";

import type { RootTagLike } from "./tag.js";
import type { RootTag, RootTagLike } from "./tag.js";

export type Name = string | null;
export type Endian = "big" | "little";
Expand All @@ -19,7 +19,7 @@ type FormatProperty<T extends FormatOptions, U extends keyof FormatOptions> = T[
/**
* An object which represents a set of NBT data.
*/
export class NBTData<T extends RootTagLike = RootTagLike, const U extends FormatOptions = FormatOptions> {
export class NBTData<T extends RootTagLike = RootTag, const U extends FormatOptions = FormatOptions> {
declare readonly data: T;
declare readonly name: FormatProperty<U,"name">;
declare readonly endian: FormatProperty<U,"endian">;
Expand Down
4 changes: 2 additions & 2 deletions src/parse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const UNQUOTED_STRING_PATTERN = /^[0-9A-Za-z.+_-]+$/;
/**
* Converts an SNBT string into a CompoundTag object.
*/
export function parse<T extends RootTagLike>(data: string): T {
export function parse<T extends RootTagLike = RootTag>(data: string): T {
if (typeof data !== "string"){
throw new TypeError("First parameter must be a string");
}
Expand All @@ -28,7 +28,7 @@ export class SNBTReader {
/**
* Initiates the reader over an SNBT string.
*/
read<T extends RootTagLike>(data: string): T {
read<T extends RootTagLike = RootTag>(data: string): T {
if (typeof data !== "string"){
throw new TypeError("First parameter must be a string");
}
Expand Down
8 changes: 4 additions & 4 deletions src/read.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ export interface ReadOptions {
*
* If a format option isn't specified, the function will attempt reading the data using all options until it either throws or returns successfully.
*/
export async function read<T extends RootTagLike, const U extends FormatOptions = FormatOptions>(data: Uint8Array | ArrayBufferLike, options?: ReadOptions): Promise<NBTData<T,U>>;
export async function read<T extends RootTagLike, const U extends FormatOptions = FormatOptions>(data: Uint8Array | ArrayBufferLike, { name, endian, compression, bedrockLevel, strict }: ReadOptions = {}): Promise<NBTData<T,U>> {
export async function read<T extends RootTagLike = RootTag, const U extends FormatOptions = FormatOptions>(data: Uint8Array | ArrayBufferLike, options?: ReadOptions): Promise<NBTData<T,U>>;
export async function read<T extends RootTagLike = RootTag, const U extends FormatOptions = FormatOptions>(data: Uint8Array | ArrayBufferLike, { name, endian, compression, bedrockLevel, strict }: ReadOptions = {}): Promise<NBTData<T,U>> {
if (!("byteOffset" in data)){
data = new Uint8Array(data);
}
Expand Down Expand Up @@ -143,8 +143,8 @@ export class NBTReader {
/**
* Initiates the reader over an NBT buffer.
*/
read<T extends RootTagLike, const U extends FormatOptions = FormatOptions>(data: Uint8Array | ArrayBufferLike, options?: NBTReaderOptions): NBTData<T,U>;
read<T extends RootTagLike, const U extends FormatOptions = FormatOptions>(data: Uint8Array | ArrayBufferLike, { name = true, endian = "big", strict = true }: NBTReaderOptions = {}): NBTData<T,U> {
read<T extends RootTagLike = RootTag, const U extends FormatOptions = FormatOptions>(data: Uint8Array | ArrayBufferLike, options?: NBTReaderOptions): NBTData<T,U>;
read<T extends RootTagLike = RootTag, const U extends FormatOptions = FormatOptions>(data: Uint8Array | ArrayBufferLike, { name = true, endian = "big", strict = true }: NBTReaderOptions = {}): NBTData<T,U> {
if (!("byteOffset" in data)){
data = new Uint8Array(data);
}
Expand Down
8 changes: 4 additions & 4 deletions src/stringify.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ export interface StringifyOptions {
/**
* Converts an NBTData object into an SNBT string.
*/
export function stringify<T extends RootTagLike>(data: T | NBTData<T>, options?: StringifyOptions): string;
export function stringify<T extends RootTagLike>(data: T | NBTData<T>, { space = "" }: StringifyOptions = {}): string {
export function stringify<T extends RootTagLike = RootTag>(data: T | NBTData<T>, options?: StringifyOptions): string;
export function stringify<T extends RootTagLike = RootTag>(data: T | NBTData<T>, { space = "" }: StringifyOptions = {}): string {
if (data instanceof NBTData){
data = data.data;
}
Expand Down Expand Up @@ -41,8 +41,8 @@ export class SNBTWriter {
/**
* Initiates the writer over an NBTData object.
*/
write<T extends RootTagLike>(data: T | NBTData<T>, options?: SNBTWriterOptions): string;
write<T extends RootTagLike>(data: T | NBTData<T>, { space = "" }: SNBTWriterOptions = {}): string {
write<T extends RootTagLike = RootTag>(data: T | NBTData<T>, options?: SNBTWriterOptions): string;
write<T extends RootTagLike = RootTag>(data: T | NBTData<T>, { space = "" }: SNBTWriterOptions = {}): string {
if (data instanceof NBTData){
data = data.data;
}
Expand Down
8 changes: 4 additions & 4 deletions src/write.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ export interface WriteOptions {
*
* If a format option isn't specified, the value of the equivalent property on the NBTData object will be used.
*/
export async function write<T extends RootTagLike>(data: T | NBTData<T>, options?: WriteOptions): Promise<Uint8Array>;
export async function write<T extends RootTagLike>(data: T | NBTData<T>, { name, endian, compression, bedrockLevel }: WriteOptions = {}): Promise<Uint8Array> {
export async function write<T extends RootTagLike = RootTag>(data: T | NBTData<T>, options?: WriteOptions): Promise<Uint8Array>;
export async function write<T extends RootTagLike = RootTag>(data: T | NBTData<T>, { name, endian, compression, bedrockLevel }: WriteOptions = {}): Promise<Uint8Array> {
if (data instanceof NBTData){
if (name === undefined) name = data.name;
if (endian === undefined) endian = data.endian;
Expand Down Expand Up @@ -82,8 +82,8 @@ export class NBTWriter {
/**
* Initiates the writer over an NBTData object.
*/
write<T extends RootTagLike>(data: T | NBTData<T>, options?: NBTWriterOptions): Uint8Array;
write<T extends RootTagLike>(data: T | NBTData<T>, { name, endian }: NBTWriterOptions = {}): Uint8Array {
write<T extends RootTagLike = RootTag>(data: T | NBTData<T>, options?: NBTWriterOptions): Uint8Array;
write<T extends RootTagLike = RootTag>(data: T | NBTData<T>, { name, endian }: NBTWriterOptions = {}): Uint8Array {
if (data instanceof NBTData){
if (name === undefined) name = data.name;
if (endian === undefined) endian = data.endian;
Expand Down

0 comments on commit 20e6ce7

Please sign in to comment.