2021-07-17 17:26:31 +03:00
const { types , toSentence , replaceSections , formatFile } = require ( '../../client/scripts/generate-updates' )
2021-05-05 00:43:35 +03:00
2021-05-27 01:02:31 +03:00
function generateHandler ( ) {
const lines = [ ]
const names = [ 'RawUpdateHandler' ]
// imports must be added manually because yeah
types . forEach ( ( type ) => {
lines . push (
` export type ${ type . handlerTypeName } Handler<T = ${ type . updateType } ` +
` ${ type . state ? ', S = never' : '' } > = ParsedUpdateHandler< ` +
` ' ${ type . typeName } ', T ${ type . state ? ', S' : '' } > `
)
names . push ( ` ${ type . handlerTypeName } Handler ` )
} )
replaceSections ( 'handler.ts' , {
codegen :
lines . join ( '\n' ) +
'\n\nexport type UpdateHandler = \n' +
names . map ( ( i ) => ` | ${ i } \n ` ) . join ( '' ) ,
2021-07-17 17:26:31 +03:00
} , _ _dirname )
2021-05-05 00:43:35 +03:00
}
function generateDispatcher ( ) {
const lines = [ ]
2021-07-17 17:26:31 +03:00
const imports = [ 'UpdateHandler' , 'RawUpdateHandler' ]
2021-05-05 00:43:35 +03:00
types . forEach ( ( type ) => {
imports . push ( ` ${ type . handlerTypeName } Handler ` )
2021-07-17 17:26:31 +03:00
lines . push ( `
2021-05-05 00:43:35 +03:00
/ * *
* Register $ { toSentence ( type ) } without any filters
*
* @ param handler $ { toSentence ( type , 'full' ) }
* @ param group Handler group index
* /
2021-06-20 02:52:19 +03:00
on$ { type . handlerTypeName } ( handler : $ { type . handlerTypeName } Handler$ { type . state ? ` < ${ type . updateType } , State extends never ? never : UpdateState<State, SceneName>> ` : '' } [ 'callback' ] , group ? : number ) : void
$ { type . state ? `
/ * *
* Register $ { toSentence ( type ) } with a filter
*
* @ param filter Update filter
* @ param handler $ { toSentence ( type , 'full' ) }
* @ param group Handler group index
* /
on$ { type . handlerTypeName } < Mod > (
filter : UpdateFilter < $ { type . updateType } , Mod , State > ,
handler : $ { type . handlerTypeName } Handler < filters . Modify < $ { type . updateType } , Mod > , State extends never ? never : UpdateState < State , SceneName >> [ 'callback' ] ,
group ? : number
) : void
` : ''}
2021-05-05 00:43:35 +03:00
/ * *
* Register $ { toSentence ( type ) } with a filter
*
* @ param filter Update filter
* @ param handler $ { toSentence ( type , 'full' ) }
* @ param group Handler group index
* /
on$ { type . handlerTypeName } < Mod > (
filter : UpdateFilter < $ { type . updateType } , Mod > ,
2021-06-20 02:52:19 +03:00
handler : $ { type . handlerTypeName } Handler < filters . Modify < $ { type . updateType } , Mod > $ { type . state ? ', State extends never ? never : UpdateState<State, SceneName>' : '' } > [ 'callback' ] ,
2021-05-05 00:43:35 +03:00
group ? : number
) : void
/** @internal */
on$ { type . handlerTypeName } ( filter : any , handler ? : any , group ? : number ) : void {
2021-07-17 17:26:31 +03:00
this . _addKnownHandler ( '${type.typeName}' , filter , handler , group )
2021-05-05 00:43:35 +03:00
}
` )
} )
replaceSections ( 'dispatcher.ts' , {
codegen : lines . join ( '\n' ) ,
'codegen-imports' :
'import {\n' +
imports . map ( ( i ) => ` ${ i } , \n ` ) . join ( '' ) +
"} from './handler'" ,
2021-07-17 17:26:31 +03:00
} , _ _dirname )
2021-05-05 00:43:35 +03:00
}
2021-07-17 17:26:31 +03:00
2021-05-05 00:43:35 +03:00
async function main ( ) {
generateHandler ( )
generateDispatcher ( )
2021-07-17 17:26:31 +03:00
await formatFile ( 'handler.ts' , _ _dirname )
await formatFile ( 'dispatcher.ts' , _ _dirname )
2021-05-05 00:43:35 +03:00
}
2021-07-17 17:26:31 +03:00
module . exports = { types , toSentence }
if ( require . main === module ) {
main ( ) . catch ( console . error )
}