@@ -9,74 +9,47 @@ import (
99 "github.com/lightningnetwork/lnd/tlv"
1010)
1111
12- const (
13- // Reject message type field TLV types.
14-
15- TypeRejectVersion tlv.Type = 0
16- TypeRejectID tlv.Type = 2
17- TypeRejectErrCode tlv.Type = 3
18- TypeRejectErrMsg tlv.Type = 5
19- )
20-
21- func TypeRecordRejectVersion (version * WireMsgDataVersion ) tlv.Record {
22- const recordSize = 1
23-
24- return tlv .MakeStaticRecord (
25- TypeRejectVersion , version , recordSize ,
26- WireMsgDataVersionEncoder , WireMsgDataVersionDecoder ,
27- )
28- }
29-
30- func TypeRecordRejectID (id * ID ) tlv.Record {
31- const recordSize = 32
32-
33- return tlv .MakeStaticRecord (
34- TypeRejectID , id , recordSize , IdEncoder , IdDecoder ,
35- )
36- }
37-
38- func TypeRecordRejectErrCode (errCode * uint8 ) tlv.Record {
39- return tlv .MakePrimitiveRecord (TypeRejectErrCode , errCode )
40- }
41-
42- func TypeRecordRejectErrMsg (errMsg * string ) tlv.Record {
43- sizeFunc := func () uint64 {
44- return uint64 (len (* errMsg ))
45- }
46- return tlv .MakeDynamicRecord (
47- TypeRejectErrMsg , errMsg , sizeFunc ,
48- rejectErrMsgEncoder , rejectErrMsgDecoder ,
49- )
50- }
12+ // rejectErrEncoder is a function that encodes a RejectErr into a writer.
13+ func rejectErrEncoder (w io.Writer , val any , buf * [8 ]byte ) error {
14+ if typ , ok := val .(* RejectErr ); ok {
15+ if err := tlv .EUint8 (w , & typ .Code , buf ); err != nil {
16+ return err
17+ }
5118
52- func rejectErrMsgEncoder (w io.Writer , val any , buf * [8 ]byte ) error {
53- if typ , ok := val .(* string ); ok {
54- msgBytes := []byte (* typ )
55- err := tlv .EVarBytes (w , & msgBytes , buf )
56- if err != nil {
19+ msgBytes := []byte (typ .Msg )
20+ if err := tlv .EVarBytes (w , & msgBytes , buf ); err != nil {
5721 return err
5822 }
5923
6024 return nil
6125 }
6226
63- return tlv .NewTypeForEncodingErr (val , "RejectErrMsg " )
27+ return tlv .NewTypeForEncodingErr (val , "RejectErr " )
6428}
6529
66- func rejectErrMsgDecoder (r io.Reader , val any , buf * [8 ]byte , l uint64 ) error {
67- if typ , ok := val .(* string ); ok {
30+ // rejectErrDecoder is a function that decodes a RejectErr from a reader.
31+ func rejectErrDecoder (r io.Reader , val any , buf * [8 ]byte , l uint64 ) error {
32+ if typ , ok := val .(* RejectErr ); ok {
33+ var rejectCode uint8
34+ if err := tlv .DUint8 (r , & rejectCode , buf , 1 ); err != nil {
35+ return err
36+ }
37+
6838 var errMsgBytes []byte
69- err := tlv .DVarBytes (r , & errMsgBytes , buf , l )
39+ err := tlv .DVarBytes (r , & errMsgBytes , buf , l - 1 )
7040 if err != nil {
7141 return err
7242 }
7343
74- * typ = string (errMsgBytes )
44+ * typ = RejectErr {
45+ Code : rejectCode ,
46+ Msg : string (errMsgBytes ),
47+ }
7548
7649 return nil
7750 }
7851
79- return tlv .NewTypeForDecodingErr (val , "RejectErrMsg " , l , l )
52+ return tlv .NewTypeForDecodingErr (val , "RejectErr " , l , l )
8053}
8154
8255// RejectErr is a struct that represents the error code and message of a quote
@@ -89,6 +62,20 @@ type RejectErr struct {
8962 Msg string
9063}
9164
65+ // Record returns a TLV record that can be used to encode/decode a RejectErr
66+ // to/from a TLV stream.
67+ func (v * RejectErr ) Record () tlv.Record {
68+ sizeFunc := func () uint64 {
69+ return 1 + uint64 (len (v .Msg ))
70+ }
71+
72+ // We set the type to zero here because the type parameter in
73+ // tlv.RecordT will be used as the actual type.
74+ return tlv .MakeDynamicRecord (
75+ 0 , v , sizeFunc , rejectErrEncoder , rejectErrDecoder ,
76+ )
77+ }
78+
9279var (
9380 // ErrUnknownReject is the error code for when the quote is rejected
9481 // for an unspecified reason.
@@ -108,65 +95,53 @@ var (
10895const (
10996 // latestRejectVersion is the latest supported reject wire message data
11097 // field version.
111- latestRejectVersion = V0
98+ latestRejectVersion = V1
11299)
113100
114- // rejectMsgData is a struct that represents the data field of a quote
115- // reject message.
116- type rejectMsgData struct {
101+ // rejectWireMsgData is a struct that represents the data field of a quote
102+ // reject wire message.
103+ type rejectWireMsgData struct {
117104 // Version is the version of the message data.
118- Version WireMsgDataVersion
105+ Version tlv. RecordT [tlv. TlvType0 , WireMsgDataVersion ]
119106
120107 // ID represents the unique identifier of the quote request message that
121108 // this response is associated with.
122- ID ID
109+ ID tlv. RecordT [tlv. TlvType2 , ID ]
123110
124111 // Err is the error code and message that provides the reason for the
125112 // rejection.
126- Err RejectErr
113+ Err tlv. RecordT [tlv. TlvType5 , RejectErr ]
127114}
128115
129- // EncodeRecords determines the non-nil records to include when encoding at
130- // runtime.
131- func (q * rejectMsgData ) encodeRecords () []tlv.Record {
116+ // records returns all records for encoding/decoding.
117+ func (q * rejectWireMsgData ) records () []tlv.Record {
132118 return []tlv.Record {
133- TypeRecordRejectVersion (& q .Version ),
134- TypeRecordRejectID (& q .ID ),
135- TypeRecordRejectErrCode (& q .Err .Code ),
136- TypeRecordRejectErrMsg (& q .Err .Msg ),
119+ q .Version .Record (),
120+ q .ID .Record (),
121+ q .Err .Record (),
137122 }
138123}
139124
140125// Encode encodes the structure into a TLV stream.
141- func (q * rejectMsgData ) Encode (writer io.Writer ) error {
142- stream , err := tlv .NewStream (q .encodeRecords ()... )
126+ func (q * rejectWireMsgData ) Encode (writer io.Writer ) error {
127+ stream , err := tlv .NewStream (q .records ()... )
143128 if err != nil {
144129 return err
145130 }
146131 return stream .Encode (writer )
147132}
148133
149- // DecodeRecords provides all TLV records for decoding.
150- func (q * rejectMsgData ) decodeRecords () []tlv.Record {
151- return []tlv.Record {
152- TypeRecordRejectVersion (& q .Version ),
153- TypeRecordRejectID (& q .ID ),
154- TypeRecordRejectErrCode (& q .Err .Code ),
155- TypeRecordRejectErrMsg (& q .Err .Msg ),
156- }
157- }
158-
159134// Decode decodes the structure from a TLV stream.
160- func (q * rejectMsgData ) Decode (r io.Reader ) error {
161- stream , err := tlv .NewStream (q .decodeRecords ()... )
135+ func (q * rejectWireMsgData ) Decode (r io.Reader ) error {
136+ stream , err := tlv .NewStream (q .records ()... )
162137 if err != nil {
163138 return err
164139 }
165140 return stream .DecodeP2P (r )
166141}
167142
168143// Bytes encodes the structure into a TLV stream and returns the bytes.
169- func (q * rejectMsgData ) Bytes () ([]byte , error ) {
144+ func (q * rejectWireMsgData ) Bytes () ([]byte , error ) {
170145 var b bytes.Buffer
171146 err := q .Encode (& b )
172147 if err != nil {
@@ -181,8 +156,9 @@ type Reject struct {
181156 // Peer is the peer that sent the quote request.
182157 Peer route.Vertex
183158
184- // rejectMsgData is the message data for the quote reject message.
185- rejectMsgData
159+ // rejectWireMsgData is the message data for the quote reject wire
160+ // message.
161+ rejectWireMsgData
186162}
187163
188164// NewReject creates a new instance of a quote reject message.
@@ -191,10 +167,12 @@ func NewReject(peer route.Vertex, requestId ID,
191167
192168 return & Reject {
193169 Peer : peer ,
194- rejectMsgData : rejectMsgData {
195- Version : latestRejectVersion ,
196- ID : requestId ,
197- Err : rejectErr ,
170+ rejectWireMsgData : rejectWireMsgData {
171+ Version : tlv.NewRecordT [tlv.TlvType0 ](
172+ latestRejectVersion ,
173+ ),
174+ ID : tlv.NewRecordT [tlv.TlvType2 ](requestId ),
175+ Err : tlv.NewRecordT [tlv.TlvType5 ](rejectErr ),
198176 },
199177 }
200178}
@@ -208,29 +186,29 @@ func NewQuoteRejectFromWireMsg(wireMsg WireMessage) (*Reject, error) {
208186 }
209187
210188 // Decode message data component from TLV bytes.
211- var msgData rejectMsgData
189+ var msgData rejectWireMsgData
212190 err := msgData .Decode (bytes .NewReader (wireMsg .Data ))
213191 if err != nil {
214192 return nil , fmt .Errorf ("unable to decode quote reject " +
215193 "message data: %w" , err )
216194 }
217195
218196 // Ensure that the message version is supported.
219- if msgData .Version > latestRejectVersion {
197+ if msgData .Version . Val != latestRejectVersion {
220198 return nil , fmt .Errorf ("unsupported reject message version: %d" ,
221- msgData .Version )
199+ msgData .Version . Val )
222200 }
223201
224202 return & Reject {
225- Peer : wireMsg .Peer ,
226- rejectMsgData : msgData ,
203+ Peer : wireMsg .Peer ,
204+ rejectWireMsgData : msgData ,
227205 }, nil
228206}
229207
230208// ToWire returns a wire message with a serialized data field.
231209func (q * Reject ) ToWire () (WireMessage , error ) {
232210 // Encode message data component as TLV bytes.
233- msgDataBytes , err := q .rejectMsgData .Bytes ()
211+ msgDataBytes , err := q .rejectWireMsgData .Bytes ()
234212 if err != nil {
235213 return WireMessage {}, fmt .Errorf ("unable to encode message " +
236214 "data: %w" , err )
@@ -250,13 +228,13 @@ func (q *Reject) MsgPeer() route.Vertex {
250228
251229// MsgID returns the quote request session ID.
252230func (q * Reject ) MsgID () ID {
253- return q .ID
231+ return q .ID . Val
254232}
255233
256234// String returns a human-readable string representation of the message.
257235func (q * Reject ) String () string {
258236 return fmt .Sprintf ("Reject(id=%x, err_code=%d, err_msg=%s)" ,
259- q .ID [:], q .Err .Code , q .Err .Msg )
237+ q .ID . Val [:], q .Err .Val . Code , q .Err . Val .Msg )
260238}
261239
262240// Ensure that the message type implements the OutgoingMsg interface.
0 commit comments