@@ -5,7 +5,7 @@ mod syntax;
55
66// dora-schema-macro/src/lib.rs
77use proc_macro:: TokenStream ;
8- use quote:: { format_ident , quote} ;
8+ use quote:: quote;
99
1010use crate :: syntax:: SchemaInput ;
1111
@@ -15,8 +15,7 @@ pub fn dora_schema(input: TokenStream) -> TokenStream {
1515
1616 let protocol_code = protocol:: generate_protocol ( & schema) ;
1717 let client_code = client:: generate_client ( & schema) ;
18- // let server_trait_code = server::generate_server_trait(&schema);
19- let server_trait_code = quote ! { } ;
18+ let server_trait_code = server:: generate_server_trait ( & schema) ;
2019
2120 let expanded = quote ! {
2221 #protocol_code
@@ -26,116 +25,3 @@ pub fn dora_schema(input: TokenStream) -> TokenStream {
2625
2726 TokenStream :: from ( expanded)
2827}
29-
30- fn generate_server ( schema : & SchemaInput ) -> proc_macro2:: TokenStream {
31- let client_name = & schema. client_name ;
32- let server_name = & schema. server_name ;
33- let handler_trait_name = format_ident ! ( "{}Handler" , server_name) ;
34- let request_enum = format_ident ! ( "{}To{}Request" , client_name, server_name) ;
35- let response_enum = format_ident ! ( "{}To{}Response" , client_name, server_name) ;
36-
37- let trait_methods: Vec < _ > = schema
38- . methods
39- . iter ( )
40- . map ( |m| {
41- let handler_name = format_ident ! ( "{}_handler" , m. name) ;
42- let request_type = & m. request ;
43- let response_type = & m. response ;
44-
45- // TODO: better
46- quote ! {
47- fn #handler_name(
48- & self ,
49- request: #request_type
50- ) -> std:: pin:: Pin <
51- Box <dyn std:: future:: Future <Output = :: eyre:: Result <#response_type>> + Send >
52- >;
53- }
54- } )
55- . collect ( ) ;
56-
57- let dispatch_arms: Vec < _ > = schema
58- . methods
59- . iter ( )
60- . map ( |m| {
61- let handler_name = format_ident ! ( "{}_handler" , m. name) ;
62- let request_variant = format_ident ! ( "{}" , capitalize( & m. name. to_string( ) ) ) ;
63- let response_variant = request_variant. clone ( ) ;
64-
65- quote ! {
66- #request_enum:: #request_variant( req) => {
67- match self . #handler_name( req) . await {
68- Ok ( resp) => {
69- let resp_enum = #response_enum:: #response_variant( resp) ;
70- :: bincode:: serialize( & resp_enum)
71- . wrap_err( "Failed to serialize response" )
72- }
73- Err ( e) => {
74- :: eyre:: bail!( "Handler error: {:?}" , e)
75- }
76- }
77- }
78- }
79- } )
80- . collect ( ) ;
81-
82- quote ! {
83- pub trait #handler_trait_name: Send + Sync {
84- #( #trait_methods) *
85- }
86-
87- pub struct #server_name<H , L > {
88- handler: H ,
89- listener: L ,
90- }
91-
92- impl <H , L > #server_name<H , L >
93- where
94- H : #handler_trait_name + ' static ,
95- L : ListenConnection ,
96- {
97- pub fn new( handler: H , listener: L ) -> Self {
98- Self { handler, listener }
99- }
100-
101- pub async fn serve( self ) -> :: eyre:: Result <( ) > {
102- loop {
103- let req_bytes = self . listener. receive( )
104- . await
105- . wrap_err( "Failed to receive request" ) ?;
106-
107- let request: #request_enum = match :: bincode:: deserialize( & req_bytes) {
108- Ok ( req) => req,
109- Err ( e) => {
110- eprintln!( "Failed to deserialize request: {:?}" , e) ;
111- continue ;
112- }
113- } ;
114-
115- let response_bytes = match request {
116- #( #dispatch_arms, ) *
117- } ;
118-
119- match response_bytes {
120- Ok ( bytes) => {
121- if let Err ( e) = self . listener. send( bytes) . await {
122- eprintln!( "Failed to send response: {:?}" , e) ;
123- }
124- }
125- Err ( e) => {
126- eprintln!( "Handler error: {:?}" , e) ;
127- }
128- }
129- }
130- }
131- }
132- }
133- }
134-
135- fn capitalize ( s : & str ) -> String {
136- let mut chars = s. chars ( ) ;
137- match chars. next ( ) {
138- Some ( first) => first. to_uppercase ( ) . chain ( chars) . collect ( ) ,
139- None => String :: new ( ) ,
140- }
141- }
0 commit comments