@@ -30,9 +30,7 @@ var isArrayBuffer = require( '@stdlib/assert/is-arraybuffer' );
30
30
var isObject = require ( '@stdlib/assert/is-object' ) ;
31
31
var hasProp = require ( '@stdlib/assert/has-property' ) ;
32
32
var min = require ( '@stdlib/math/base/special/fast/min' ) ;
33
- var join = require ( '@stdlib/array/base/join' ) ;
34
33
var filled = require ( '@stdlib/array/base/filled' ) ;
35
- var indexOf = require ( '@stdlib/array/base/index-of' ) ;
36
34
var ArrayBuffer = require ( '@stdlib/array/buffer' ) ;
37
35
var DataView = require ( '@stdlib/array/dataview' ) ;
38
36
var format = require ( '@stdlib/string/format' ) ;
@@ -42,6 +40,7 @@ var createPrototypeAccessors = require( './create_prototype_accessors.js' );
42
40
var isStruct = require ( './is_struct.js' ) ;
43
41
var normalize = require ( './normalize_field_list.js' ) ;
44
42
var fieldNames = require ( './field_names.js' ) ;
43
+ var fieldIndex = require ( './field_index.js' ) ;
45
44
var resolveAlignment = require ( './resolve_alignment.js' ) ;
46
45
var byteOffsets = require ( './byte_offsets.js' ) ;
47
46
var partitions = require ( './partitions.js' ) ;
@@ -329,17 +328,14 @@ function factory( fields ) {
329
328
* @readonly
330
329
* @type {Function }
331
330
* @param {string } name - field name
331
+ * @throws {Error } struct must have at least one field
332
332
* @throws {TypeError } must provide a recognized field name
333
333
* @returns {NonNegativeInteger } byte length
334
334
*/
335
335
setReadOnly ( Struct , 'byteLengthOf' , function byteLengthOf ( name ) {
336
- var idx ;
337
- if ( FIELD_NAMES . length === 0 ) {
338
- throw new Error ( 'invalid operation. struct does not have any fields.' ) ;
339
- }
340
- idx = indexOf ( FIELD_NAMES , name , 0 ) ;
341
- if ( idx < 0 ) {
342
- throw new TypeError ( format ( 'invalid argument. First argument must be one of the following: "%s". Value: `%s`.' , join ( FIELD_NAMES , ', ' ) , name ) ) ;
336
+ var idx = fieldIndex ( FIELD_NAMES , name ) ;
337
+ if ( idx instanceof Error ) {
338
+ throw idx ;
343
339
}
344
340
return FIELDS [ idx ] . byteLength ;
345
341
} ) ;
@@ -353,17 +349,14 @@ function factory( fields ) {
353
349
* @readonly
354
350
* @type {Function }
355
351
* @param {string } name - field name
352
+ * @throws {Error } struct must have at least one field
356
353
* @throws {TypeError } must provide a recognized field name
357
354
* @returns {NonNegativeInteger } byte offset
358
355
*/
359
356
setReadOnly ( Struct , 'byteOffsetOf' , function byteOffsetOf ( name ) {
360
- var idx ;
361
- if ( FIELD_NAMES . length === 0 ) {
362
- throw new Error ( 'invalid operation. struct does not have any fields.' ) ;
363
- }
364
- idx = indexOf ( FIELD_NAMES , name , 0 ) ;
365
- if ( idx < 0 ) {
366
- throw new TypeError ( format ( 'invalid argument. First argument must be one of the following: "%s". Value: `%s`.' , join ( FIELD_NAMES , ', ' ) , name ) ) ;
357
+ var idx = fieldIndex ( FIELD_NAMES , name ) ;
358
+ if ( idx instanceof Error ) {
359
+ throw idx ;
367
360
}
368
361
return FIELDS [ idx ] . byteOffset ;
369
362
} ) ;
@@ -377,21 +370,39 @@ function factory( fields ) {
377
370
* @readonly
378
371
* @type {Function }
379
372
* @param {string } name - field name
373
+ * @throws {Error } struct must have at least one field
380
374
* @throws {TypeError } must provide a recognized field name
381
375
* @returns {string } description
382
376
*/
383
377
setReadOnly ( Struct , 'descriptionOf' , function descriptionOf ( name ) {
384
- var idx ;
385
- if ( FIELD_NAMES . length === 0 ) {
386
- throw new Error ( 'invalid operation. struct does not have any fields.' ) ;
387
- }
388
- idx = indexOf ( FIELD_NAMES , name , 0 ) ;
389
- if ( idx < 0 ) {
390
- throw new TypeError ( format ( 'invalid argument. First argument must be one of the following: "%s". Value: `%s`.' , join ( FIELD_NAMES , ', ' ) , name ) ) ;
378
+ var idx = fieldIndex ( FIELD_NAMES , name ) ;
379
+ if ( idx instanceof Error ) {
380
+ throw idx ;
391
381
}
392
382
return FIELDS [ idx ] . description ;
393
383
} ) ;
394
384
385
+ /**
386
+ * Returns the type associated with a provided field name.
387
+ *
388
+ * @private
389
+ * @name typeOf
390
+ * @memberof Struct
391
+ * @readonly
392
+ * @type {Function }
393
+ * @param {string } name - field name
394
+ * @throws {Error } struct must have at least one field
395
+ * @throws {TypeError } must provide a recognized field name
396
+ * @returns {(string|Object) } type
397
+ */
398
+ setReadOnly ( Struct , 'typeOf' , function typeOf ( name ) {
399
+ var idx = fieldIndex ( FIELD_NAMES , name ) ;
400
+ if ( idx instanceof Error ) {
401
+ throw idx ;
402
+ }
403
+ return FIELDS [ idx ] . type ;
404
+ } ) ;
405
+
395
406
/**
396
407
* Returns the underlying byte buffer of a `struct`.
397
408
*
0 commit comments