in packages/gguf/src/gguf.ts [190:235]
function readMetadataValue(
view: DataView,
type: GGUFValueType,
offset: number,
version: Version,
littleEndian: boolean
): Slice<MetadataValue> {
switch (type) {
case GGUFValueType.UINT8:
return { value: view.getUint8(offset), length: 1 };
case GGUFValueType.INT8:
return { value: view.getInt8(offset), length: 1 };
case GGUFValueType.UINT16:
return { value: view.getUint16(offset, littleEndian), length: 2 };
case GGUFValueType.INT16:
return { value: view.getInt16(offset, littleEndian), length: 2 };
case GGUFValueType.UINT32:
return { value: view.getUint32(offset, littleEndian), length: 4 };
case GGUFValueType.INT32:
return { value: view.getInt32(offset, littleEndian), length: 4 };
case GGUFValueType.FLOAT32:
return { value: view.getFloat32(offset, littleEndian), length: 4 };
case GGUFValueType.BOOL:
return { value: view.getUint8(offset) !== 0, length: 1 };
case GGUFValueType.STRING:
return readString(view, offset, version, littleEndian);
case GGUFValueType.ARRAY: {
const arrayType = view.getUint32(offset, littleEndian);
const arrayLength = readVersionedSize(view, offset + 4, version, littleEndian);
let length = 4 + arrayLength.length;
const arrayValues: MetadataValue[] = [];
for (let i = 0; i < arrayLength.value; i++) {
const metadataValue = readMetadataValue(view, arrayType, offset + length, version, littleEndian);
arrayValues.push(metadataValue.value);
length += metadataValue.length;
}
return { value: arrayValues, length };
}
case GGUFValueType.UINT64:
return { value: view.getBigUint64(offset, littleEndian), length: 8 };
case GGUFValueType.INT64:
return { value: view.getBigInt64(offset, littleEndian), length: 8 };
case GGUFValueType.FLOAT64:
return { value: view.getFloat64(offset, littleEndian), length: 8 };
}
}