Skip to content

Commit d8ea5bd

Browse files
committed
defineStruct will now make properties enumerable if not specified
1 parent 345f6a4 commit d8ea5bd

File tree

4 files changed

+33
-27
lines changed

4 files changed

+33
-27
lines changed

core.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,31 @@ function subclassWithProperties<
127127

128128
/**
129129
* Subclass struct by adding the given property descriptors
130-
* @param propertyDescriptors properties to add to subclass instances
130+
* @param propertyDescriptors properties to add to subclass instances.
131+
* If enumerable is not specified, it will default to true.
131132
* @returns A new class, inheriting from `Struct`, with the new property descriptors added
132133
*/
133134
export function defineStruct<const Props extends PropertyDescriptorMap>(
134135
propertyDescriptors: Props,
135136
): SubclassWithProperties<typeof Struct, MixinFromProps<Props>> {
136-
return subclassWithProperties(Struct, propertyDescriptors)
137+
function defaultEnumerable(descriptor: PropertyDescriptor) {
138+
return Object.create(descriptor, {
139+
enumerable: { value: descriptor.enumerable ?? true },
140+
})
141+
}
142+
const newDescriptorEntries = Object.entries(propertyDescriptors).map(
143+
(
144+
[name, value],
145+
) => [
146+
name,
147+
defaultEnumerable(value),
148+
],
149+
)
150+
const newDescriptors = Object.fromEntries(
151+
newDescriptorEntries,
152+
) as Props
153+
154+
return subclassWithProperties(Struct, newDescriptors)
137155
}
138156

139157
/**

deno.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@rotu/structview",
3-
"version": "0.10.3",
3+
"version": "0.11.0",
44
"license": "MIT",
55
"tasks": {
66
"dev": "deno test --watch",
@@ -9,6 +9,7 @@
99
"fmt": {
1010
"semiColons": false
1111
},
12+
"exclude": ["./npm"],
1213
"imports": {
1314
"@deno/dnt": "jsr:@deno/dnt@^0.42.3",
1415
"@std/assert": "jsr:@std/assert@1",

fields.ts

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import type {
1515
*/
1616
export function u8(fieldOffset: number): StructPropertyDescriptor<number> {
1717
return {
18-
enumerable: true,
1918
get() {
2019
return structDataView(this).getUint8(fieldOffset)
2120
},
@@ -29,7 +28,6 @@ export function u8(fieldOffset: number): StructPropertyDescriptor<number> {
2928
*/
3029
export function u16(fieldOffset: number): StructPropertyDescriptor<number> {
3130
return {
32-
enumerable: true,
3331
get() {
3432
return structDataView(this).getUint16(fieldOffset, true)
3533
},
@@ -43,7 +41,6 @@ export function u16(fieldOffset: number): StructPropertyDescriptor<number> {
4341
*/
4442
export function u32(fieldOffset: number): StructPropertyDescriptor<number> {
4543
return {
46-
enumerable: true,
4744
get() {
4845
return structDataView(this).getUint32(fieldOffset, true)
4946
},
@@ -57,7 +54,6 @@ export function u32(fieldOffset: number): StructPropertyDescriptor<number> {
5754
*/
5855
export function u64(fieldOffset: number): StructPropertyDescriptor<bigint> {
5956
return {
60-
enumerable: true,
6157
get() {
6258
return structDataView(this).getBigUint64(fieldOffset, true)
6359
},
@@ -71,7 +67,6 @@ export function u64(fieldOffset: number): StructPropertyDescriptor<bigint> {
7167
*/
7268
export function i8(fieldOffset: number): StructPropertyDescriptor<number> {
7369
return {
74-
enumerable: true,
7570
get() {
7671
return structDataView(this).getInt8(fieldOffset)
7772
},
@@ -85,7 +80,6 @@ export function i8(fieldOffset: number): StructPropertyDescriptor<number> {
8580
*/
8681
export function i16(fieldOffset: number): StructPropertyDescriptor<number> {
8782
return {
88-
enumerable: true,
8983
get() {
9084
return structDataView(this).getInt16(fieldOffset, true)
9185
},
@@ -99,7 +93,6 @@ export function i16(fieldOffset: number): StructPropertyDescriptor<number> {
9993
*/
10094
export function i32(fieldOffset: number): StructPropertyDescriptor<number> {
10195
return {
102-
enumerable: true,
10396
get() {
10497
return structDataView(this).getInt32(fieldOffset, true)
10598
},
@@ -113,7 +106,6 @@ export function i32(fieldOffset: number): StructPropertyDescriptor<number> {
113106
*/
114107
export function i64(fieldOffset: number): StructPropertyDescriptor<bigint> {
115108
return {
116-
enumerable: true,
117109
get() {
118110
return structDataView(this).getBigInt64(fieldOffset, true)
119111
},
@@ -197,7 +189,6 @@ export function f16(fieldOffset: number): StructPropertyDescriptor<number> {
197189
throw new TypeError("float16 is not supported in this environment")
198190
}
199191
return {
200-
enumerable: true,
201192
get() {
202193
return structDataView(this).getFloat16(fieldOffset, true)
203194
},
@@ -212,7 +203,6 @@ export function f16(fieldOffset: number): StructPropertyDescriptor<number> {
212203
*/
213204
export function f32(fieldOffset: number): StructPropertyDescriptor<number> {
214205
return {
215-
enumerable: true,
216206
get() {
217207
return structDataView(this).getFloat32(fieldOffset, true)
218208
},
@@ -227,7 +217,6 @@ export function f32(fieldOffset: number): StructPropertyDescriptor<number> {
227217
*/
228218
export function f64(fieldOffset: number): StructPropertyDescriptor<number> {
229219
return {
230-
enumerable: true,
231220
get() {
232221
return structDataView(this).getFloat64(fieldOffset, true)
233222
},
@@ -247,7 +236,6 @@ export function string(
247236
const TEXT_DECODER = new TextDecoder()
248237
const TEXT_ENCODER = new TextEncoder()
249238
return {
250-
enumerable: true,
251239
get() {
252240
const str = TEXT_DECODER.decode(
253241
structBytes(this, fieldOffset, fieldOffset + byteLength),
@@ -273,7 +261,6 @@ export function string(
273261
*/
274262
export function bool(fieldOffset: number): StructPropertyDescriptor<boolean> {
275263
return {
276-
enumerable: true,
277264
get() {
278265
return Boolean(structDataView(this).getUint8(fieldOffset))
279266
},
@@ -292,7 +279,6 @@ export function fromDataView<T>(
292279
fieldGetter: (dv: DataView) => T,
293280
): StructPropertyDescriptor<T> {
294281
return {
295-
enumerable: true,
296282
get() {
297283
const dv = structDataView(this)
298284
return fieldGetter(dv)
@@ -349,7 +335,6 @@ export function typedArray<T>(
349335
): StructPropertyDescriptor<T> {
350336
const { length, species } = kwargs
351337
return {
352-
enumerable: true,
353338
get() {
354339
const dv = structDataView(this)
355340
let lengthValue
@@ -376,7 +361,6 @@ export function typedArray<T>(
376361
*/
377362
export function u16be(fieldOffset: number): StructPropertyDescriptor<number> {
378363
return {
379-
enumerable: true,
380364
get() {
381365
return structDataView(this).getUint16(fieldOffset, false)
382366
},
@@ -390,7 +374,6 @@ export function u16be(fieldOffset: number): StructPropertyDescriptor<number> {
390374
*/
391375
export function u32be(fieldOffset: number): StructPropertyDescriptor<number> {
392376
return {
393-
enumerable: true,
394377
get() {
395378
return structDataView(this).getUint32(fieldOffset, false)
396379
},
@@ -404,7 +387,6 @@ export function u32be(fieldOffset: number): StructPropertyDescriptor<number> {
404387
*/
405388
export function u64be(fieldOffset: number): StructPropertyDescriptor<bigint> {
406389
return {
407-
enumerable: true,
408390
get() {
409391
return structDataView(this).getBigUint64(fieldOffset, false)
410392
},
@@ -418,7 +400,6 @@ export function u64be(fieldOffset: number): StructPropertyDescriptor<bigint> {
418400
*/
419401
export function i16be(fieldOffset: number): StructPropertyDescriptor<number> {
420402
return {
421-
enumerable: true,
422403
get() {
423404
return structDataView(this).getInt16(fieldOffset, false)
424405
},
@@ -432,7 +413,6 @@ export function i16be(fieldOffset: number): StructPropertyDescriptor<number> {
432413
*/
433414
export function i32be(fieldOffset: number): StructPropertyDescriptor<number> {
434415
return {
435-
enumerable: true,
436416
get() {
437417
return structDataView(this).getInt32(fieldOffset, false)
438418
},
@@ -446,7 +426,6 @@ export function i32be(fieldOffset: number): StructPropertyDescriptor<number> {
446426
*/
447427
export function i64be(fieldOffset: number): StructPropertyDescriptor<bigint> {
448428
return {
449-
enumerable: true,
450429
get() {
451430
return structDataView(this).getBigInt64(fieldOffset, false)
452431
},
@@ -467,7 +446,6 @@ export function f16be(fieldOffset: number): StructPropertyDescriptor<number> {
467446
throw new TypeError("float16 is not supported in this environment")
468447
}
469448
return {
470-
enumerable: true,
471449
get() {
472450
return structDataView(this).getFloat16(fieldOffset, false)
473451
},
@@ -482,7 +460,6 @@ export function f16be(fieldOffset: number): StructPropertyDescriptor<number> {
482460
*/
483461
export function f32be(fieldOffset: number): StructPropertyDescriptor<number> {
484462
return {
485-
enumerable: true,
486463
get() {
487464
return structDataView(this).getFloat32(fieldOffset, false)
488465
},
@@ -497,7 +474,6 @@ export function f32be(fieldOffset: number): StructPropertyDescriptor<number> {
497474
*/
498475
export function f64be(fieldOffset: number): StructPropertyDescriptor<number> {
499476
return {
500-
enumerable: true,
501477
get() {
502478
return structDataView(this).getFloat64(fieldOffset, false)
503479
},

mod_test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,17 @@ Deno.test("struct has no enumerable properties", () => {
5353
fail(`unexpected key '${x}'`)
5454
}
5555
})
56+
Deno.test("defineStruct makes enumerable properties", () => {
57+
class S extends defineStruct({
58+
x: u32(0),
59+
y: f32(4),
60+
}) {}
61+
const enumeratedKeys = []
62+
for (const k in S.prototype) {
63+
enumeratedKeys.push(k)
64+
}
65+
assertEquals(enumeratedKeys, ["x", "y"])
66+
})
5667

5768
Deno.test("struct", () => {
5869
const s = new Struct({ buffer: new ArrayBuffer(10) })

0 commit comments

Comments
 (0)