1- from msggen .model import Method , CompositeField , Service
2- from msggen .grpc import GrpcGenerator , GrpcConverterGenerator , GrpcUnconverterGenerator , GrpcServerGenerator
3- from msggen .rust import RustGenerator
4- from pathlib import Path
5- import subprocess
61import json
2+ from msggen .gen .grpc import GrpcGenerator , GrpcConverterGenerator , GrpcUnconverterGenerator , GrpcServerGenerator
3+ from msggen .gen .rust import RustGenerator
4+ from msggen .gen .generator import GeneratorChain
5+ from msggen .utils import repo_root , load_jsonrpc_service
76
87
9- # Sometimes we want to rename a method, due to a name clash
10- method_name_override = {
11- "Connect" : "ConnectPeer" ,
12- }
13-
14-
15- def repo_root ():
16- path = subprocess .check_output (["git" , "rev-parse" , "--show-toplevel" ])
17- return Path (path .strip ().decode ('UTF-8' ))
18-
19-
20- def load_jsonrpc_method (name ):
21- """Load a method based on the file naming conventions for the JSON-RPC.
22- """
23- base_path = (repo_root () / "doc" / "schemas" ).resolve ()
24- req_file = base_path / f"{ name .lower ()} .request.json"
25- resp_file = base_path / f"{ name .lower ()} .schema.json"
26- request = CompositeField .from_js (json .load (open (req_file )), path = name )
27- response = CompositeField .from_js (json .load (open (resp_file )), path = name )
28-
29- # Normalize the method request and response typename so they no
30- # longer conflict.
31- request .typename += "Request"
32- response .typename += "Response"
33-
34- return Method (
35- name = method_name_override .get (name , name ),
36- request = request ,
37- response = response ,
38- )
39-
40-
41- def load_jsonrpc_service ():
42- method_names = [
43- "Getinfo" ,
44- "ListPeers" ,
45- "ListFunds" ,
46- "SendPay" ,
47- "ListChannels" ,
48- "AddGossip" ,
49- "AutoCleanInvoice" ,
50- "CheckMessage" ,
51- "Close" ,
52- "Connect" ,
53- "CreateInvoice" ,
54- "Datastore" ,
55- "CreateOnion" ,
56- "DelDatastore" ,
57- "DelExpiredInvoice" ,
58- "DelInvoice" ,
59- "Invoice" ,
60- "ListDatastore" ,
61- "ListInvoices" ,
62- "SendOnion" ,
63- "ListSendPays" ,
64- "ListTransactions" ,
65- "Pay" ,
66- "ListNodes" ,
67- "WaitAnyInvoice" ,
68- "WaitInvoice" ,
69- "WaitSendPay" ,
70- "NewAddr" ,
71- "Withdraw" ,
72- "KeySend" ,
73- "FundPsbt" ,
74- "SendPsbt" ,
75- "SignPsbt" ,
76- "UtxoPsbt" ,
77- "TxDiscard" ,
78- "TxPrepare" ,
79- "TxSend" ,
80- # "decodepay",
81- # "decode",
82- # "delpay",
83- # "disableoffer",
84- "Disconnect" ,
85- "Feerates" ,
86- # "fetchinvoice",
87- # "fundchannel_cancel",
88- # "fundchannel_complete",
89- # "fundchannel",
90- # "fundchannel_start",
91- # "funderupdate",
92- # "getlog",
93- "GetRoute" ,
94- # "getsharedsecret",
95- "ListForwards" ,
96- # "listoffers",
97- "ListPays" ,
98- # "multifundchannel",
99- # "multiwithdraw",
100- # "offerout",
101- # "offer",
102- # "openchannel_abort",
103- # "openchannel_bump",
104- # "openchannel_init",
105- # "openchannel_signed",
106- # "openchannel_update",
107- # "parsefeerate",
108- "Ping" ,
109- # "plugin",
110- # "reserveinputs",
111- # "sendcustommsg",
112- # "sendinvoice",
113- # "sendonionmessage",
114- # "setchannelfee",
115- "SignMessage" ,
116- # "unreserveinputs",
117- # "waitblockheight",
118- # "ListConfigs",
119- # "check", # No point in mapping this one
120- # "Stop", # Breaks a core assumption (root is an object) can't map unless we change this
121- # "notifications", # No point in mapping this
122- # "help",
123- ]
124- methods = [load_jsonrpc_method (name ) for name in method_names ]
125- service = Service (name = "Node" , methods = methods )
126- service .includes = ['primitives.proto' ] # Make sure we have the primitives included.
127- return service
128-
129-
130- def gengrpc (service , meta ):
8+ def gengrpc (generator_chain : GeneratorChain , meta ):
1319 """Load all mapped RPC methods, wrap them in a Service, and split them into messages.
13210 """
13311 fname = repo_root () / "cln-grpc" / "proto" / "node.proto"
13412 dest = open (fname , "w" )
135- GrpcGenerator (dest , meta ). generate ( service )
13+ generator_chain . add_generator ( GrpcGenerator (dest , meta ))
13614
13715 fname = repo_root () / "cln-grpc" / "src" / "convert.rs"
13816 dest = open (fname , "w" )
139- GrpcConverterGenerator (dest ). generate ( service )
140- GrpcUnconverterGenerator (dest ). generate ( service )
17+ generator_chain . add_generator ( GrpcConverterGenerator (dest ))
18+ generator_chain . add_generator ( GrpcUnconverterGenerator (dest ))
14119
14220 fname = repo_root () / "cln-grpc" / "src" / "server.rs"
14321 dest = open (fname , "w" )
144- GrpcServerGenerator (dest ). generate ( service )
22+ generator_chain . add_generator ( GrpcServerGenerator (dest ))
14523
14624
147- def genrustjsonrpc (service ):
25+ def genrustjsonrpc (generator_chain : GeneratorChain ):
14826 fname = repo_root () / "cln-rpc" / "src" / "model.rs"
14927 dest = open (fname , "w" )
150- RustGenerator (dest ). generate ( service )
28+ generator_chain . add_generator ( RustGenerator (dest ))
15129
15230
15331def load_msggen_meta ():
@@ -163,8 +41,13 @@ def write_msggen_meta(meta):
16341def run ():
16442 service = load_jsonrpc_service ()
16543 meta = load_msggen_meta ()
166- gengrpc (service , meta )
167- genrustjsonrpc (service )
44+ generator_chain = GeneratorChain ()
45+
46+ gengrpc (generator_chain , meta )
47+ genrustjsonrpc (generator_chain )
48+
49+ generator_chain .generate (service )
50+
16851 write_msggen_meta (meta )
16952
17053
0 commit comments