@@ -16,8 +16,15 @@ export interface MessageTransformer<TMessage extends Conf.MessageArrayLike> {
1616 transformerType : Conf . MessageArrayLikeType ;
1717 combineMessages ( ...messages : TMessage [ ] ) : TMessage ;
1818
19- messageToString ( message : TMessage ) : string ;
20- messageToUint8Array ( message : TMessage ) : Uint8Array ;
19+ as < TTarget extends Conf . MessageArrayLike > (
20+ msg : Conf . MessageArrayLike ,
21+ targetType : TTarget ,
22+ ) : TTarget ;
23+
24+ asType < TTarget extends Conf . MessageArrayLike > (
25+ msg : Conf . MessageArrayLike ,
26+ targetType : Conf . MessageArrayLikeType ,
27+ ) : TTarget ;
2128}
2229
2330export class RawMessageTransformer implements MessageTransformer < Uint8Array > {
@@ -34,12 +41,32 @@ export class RawMessageTransformer implements MessageTransformer<Uint8Array> {
3441 ) . buffer ;
3542 }
3643
37- messageToString ( message : Uint8Array ) : string {
38- return asString ( message ) ;
44+ as < TTarget extends Conf . MessageArrayLike > (
45+ msg : Conf . MessageArrayLike ,
46+ targetType : TTarget ,
47+ ) : TTarget {
48+ if ( typeof targetType === "string" ) {
49+ return asString ( msg ) as TTarget ;
50+ } else if ( targetType instanceof Uint8Array ) {
51+ return msg as TTarget ;
52+ } else {
53+ throw new Error ( "Unknown message type not implemented!" ) ;
54+ }
3955 }
4056
41- messageToUint8Array ( message : Uint8Array ) : Uint8Array {
42- return message ;
57+ asType < TTarget extends Conf . MessageArrayLike > (
58+ msg : Conf . MessageArrayLike ,
59+ targetType : Conf . MessageArrayLikeType ,
60+ ) : TTarget {
61+ switch ( targetType ) {
62+ default :
63+ Util . exhaustiveMatchGuard ( targetType ) ;
64+ break ;
65+ case 'string' :
66+ return asString ( msg ) as TTarget ;
67+ case 'Uint8Array' :
68+ return msg as TTarget ;
69+ }
4370 }
4471}
4572
@@ -49,11 +76,33 @@ export class StringMessageTransformer implements MessageTransformer<string> {
4976 combineMessages ( ...messages : string [ ] ) : string {
5077 return messages . join ( '' ) ;
5178 }
52- messageToString ( message : string ) : string {
53- return message ;
79+
80+ as < TTarget extends Conf . MessageArrayLike > (
81+ msg : Conf . MessageArrayLike ,
82+ targetType : TTarget ,
83+ ) : TTarget {
84+ if ( typeof targetType === "string" ) {
85+ return msg as TTarget ;
86+ } else if ( targetType instanceof Uint8Array ) {
87+ return asUint8Array ( msg ) as TTarget ;
88+ } else {
89+ throw new Error ( "Unknown message type not implemented!" ) ;
90+ }
5491 }
55- messageToUint8Array ( message : string ) : Uint8Array {
56- return asUint8Array ( message ) ;
92+
93+ asType < TTarget extends Conf . MessageArrayLike > (
94+ msg : Conf . MessageArrayLike ,
95+ targetType : Conf . MessageArrayLikeType ,
96+ ) : TTarget {
97+ switch ( targetType ) {
98+ default :
99+ Util . exhaustiveMatchGuard ( targetType ) ;
100+ break ;
101+ case 'string' :
102+ return msg as TTarget ;
103+ case 'Uint8Array' :
104+ return asUint8Array ( msg ) as TTarget ;
105+ }
57106 }
58107}
59108
@@ -90,6 +139,21 @@ export function asTargetMessageType<TMessage extends Conf.MessageArrayLike>(
90139 }
91140}
92141
142+ export function asTargetMessageLikeType < TMessage extends Conf . MessageArrayLike > (
143+ msg : Conf . MessageArrayLike ,
144+ targetType : Conf . MessageArrayLikeType ,
145+ ) : TMessage {
146+ switch ( targetType ) {
147+ default :
148+ Util . exhaustiveMatchGuard ( targetType ) ;
149+ break ;
150+ case 'Uint8Array' :
151+ return asUint8Array ( msg ) as TMessage ;
152+ case 'string' :
153+ return asString ( msg ) as TMessage ;
154+ }
155+ }
156+
93157export type AwaitedCommand = {
94158 cmd : IPrinterCommand ,
95159 promise : Promise < boolean > ,
0 commit comments