@@ -37,22 +37,22 @@ const types: Record<string, string> = {
37
37
uint64 : 'bigint'
38
38
}
39
39
40
- const encoderGenerators : Record < string , ( val : string ) => string > = {
41
- bool : ( val ) => `w.bool(${ val } )` ,
42
- bytes : ( val ) => `w.bytes(${ val } )` ,
43
- double : ( val ) => `w.double(${ val } )` ,
44
- fixed32 : ( val ) => `w.fixed32(${ val } )` ,
45
- fixed64 : ( val ) => `w.fixed64(${ val } )` ,
46
- float : ( val ) => `w.float(${ val } )` ,
47
- int32 : ( val ) => `w.int32(${ val } )` ,
48
- int64 : ( val ) => `w.int64(${ val } )` ,
49
- sfixed32 : ( val ) => `w.sfixed32(${ val } )` ,
50
- sfixed64 : ( val ) => `w.sfixed64(${ val } )` ,
51
- sint32 : ( val ) => `w.sint32(${ val } )` ,
52
- sint64 : ( val ) => `w.sint64(${ val } )` ,
53
- string : ( val ) => `w.string(${ val } )` ,
54
- uint32 : ( val ) => `w.uint32(${ val } )` ,
55
- uint64 : ( val ) => `w.uint64(${ val } )`
40
+ const encoderGenerators : Record < string , ( val : string , includeDefault : boolean ) => string > = {
41
+ bool : ( val , includeDefault ) => `w.bool(${ val } ${ includeDefault ? ' ?? false' : '' } )` ,
42
+ bytes : ( val , includeDefault ) => `w.bytes(${ val } ${ includeDefault ? ' ?? new Uint8Array(0)' : '' } )` ,
43
+ double : ( val , includeDefault ) => `w.double(${ val } ${ includeDefault ? ' ?? 0' : '' } )` ,
44
+ fixed32 : ( val , includeDefault ) => `w.fixed32(${ val } ${ includeDefault ? ' ?? 0' : '' } )` ,
45
+ fixed64 : ( val , includeDefault ) => `w.fixed64(${ val } ${ includeDefault ? ' ?? 0n' : '' } )` ,
46
+ float : ( val , includeDefault ) => `w.float(${ val } ${ includeDefault ? ' ?? 0' : '' } )` ,
47
+ int32 : ( val , includeDefault ) => `w.int32(${ val } ${ includeDefault ? ' ?? 0' : '' } )` ,
48
+ int64 : ( val , includeDefault ) => `w.int64(${ val } ${ includeDefault ? ' ?? 0n' : '' } )` ,
49
+ sfixed32 : ( val , includeDefault ) => `w.sfixed32(${ val } ${ includeDefault ? ' ?? 0' : '' } )` ,
50
+ sfixed64 : ( val , includeDefault ) => `w.sfixed64(${ val } ${ includeDefault ? ' ?? 0n' : '' } )` ,
51
+ sint32 : ( val , includeDefault ) => `w.sint32(${ val } ${ includeDefault ? ' ?? 0' : '' } )` ,
52
+ sint64 : ( val , includeDefault ) => `w.sint64(${ val } ${ includeDefault ? ' ?? 0n' : '' } )` ,
53
+ string : ( val , includeDefault ) => `w.string(${ val } ${ includeDefault ? ' ?? \'\'' : '' } )` ,
54
+ uint32 : ( val , includeDefault ) => `w.uint32(${ val } ${ includeDefault ? ' ?? 0' : '' } )` ,
55
+ uint64 : ( val , includeDefault ) => `w.uint64(${ val } ${ includeDefault ? ' ?? 0n' : '' } )`
56
56
}
57
57
58
58
const decoderGenerators : Record < string , ( ) => string > = {
@@ -401,15 +401,26 @@ export interface ${messageDef.name} {
401
401
}
402
402
}
403
403
404
- function createWriteField ( valueVar : string ) : string {
404
+ function createWriteField ( valueVar : string ) : ( includeDefault : boolean ) => string {
405
405
const id = ( fieldDef . id << 3 ) | codecTypes [ type ]
406
+ let defaultValue = ''
406
407
407
- let writeField = `w.uint32(${ id } )
408
- ${ encoderGenerators [ type ] == null ? `${ codec } .encode(${ valueVar } , w)` : encoderGenerators [ type ] ( valueVar ) } `
408
+ if ( fieldDef . enum ) {
409
+ const def = findDef ( fieldDef . type , messageDef , moduleDef )
410
+
411
+ if ( ! isEnumDef ( def ) ) {
412
+ throw new Error ( `${ fieldDef . type } was not enum def` )
413
+ }
414
+
415
+ defaultValue = Object . keys ( def . values ) [ 0 ]
416
+ }
417
+
418
+ let writeField = ( includeDefault : boolean ) => `w.uint32(${ id } )
419
+ ${ encoderGenerators [ type ] == null ? `${ codec } .encode(${ valueVar } ${ includeDefault ? ` ?? ${ typeName } .${ defaultValue } ` : '' } , w)` : encoderGenerators [ type ] ( valueVar , includeDefault ) } `
409
420
410
421
if ( type === 'message' ) {
411
422
// message fields are only written if they have values
412
- writeField = `w.uint32(${ id } )
423
+ writeField = ( ) => `w.uint32(${ id } )
413
424
${ typeName } .codec().encode(${ valueVar } , w, {
414
425
writeDefaults: ${ Boolean ( fieldDef . repeated ) . toString ( ) }
415
426
})`
@@ -422,10 +433,10 @@ export interface ${messageDef.name} {
422
433
423
434
if ( fieldDef . repeated ) {
424
435
if ( fieldDef . map ) {
425
- writeField = `
436
+ writeField = ( ) => `
426
437
for (const [key, value] of obj.${ name } .entries()) {
427
438
${
428
- createWriteField ( '{ key, value }' )
439
+ createWriteField ( '{ key, value }' ) ( false )
429
440
. split ( '\n' )
430
441
. map ( s => {
431
442
const trimmed = s . trim ( )
@@ -437,10 +448,10 @@ export interface ${messageDef.name} {
437
448
}
438
449
` . trim ( )
439
450
} else {
440
- writeField = `
451
+ writeField = ( ) => `
441
452
for (const value of obj.${ name } ) {
442
453
${
443
- createWriteField ( 'value' )
454
+ createWriteField ( 'value' ) ( false )
444
455
. split ( '\n' )
445
456
. map ( s => {
446
457
const trimmed = s . trim ( )
@@ -456,7 +467,7 @@ export interface ${messageDef.name} {
456
467
457
468
return `
458
469
if (${ valueTest } ) {
459
- ${ writeField }
470
+ ${ writeField ( valueTest . includes ( 'opts.writeDefaults === true' ) ) }
460
471
}`
461
472
} ) . join ( '\n' )
462
473
@@ -537,7 +548,7 @@ ${encodeFields === '' ? '' : `${encodeFields}\n`}
537
548
return _codec
538
549
}
539
550
540
- export const encode = (obj: ${ messageDef . name } ): Uint8Array => {
551
+ export const encode = (obj: Partial< ${ messageDef . name } > ): Uint8Array => {
541
552
return encodeMessage(obj, ${ messageDef . name } .codec())
542
553
}
543
554
0 commit comments