@@ -22,47 +22,37 @@ pub enum TaskRequest {
22
22
DbUpdateQuestion ( Request < QuestionModel > ) ,
23
23
}
24
24
25
- impl TaskRequest {
26
- pub async fn execute (
27
- self ,
28
- client : & reqwest:: Client ,
29
- conn : & DatabaseConnection ,
30
- ) -> TaskResponse {
31
- match self {
32
- TaskRequest :: QuestionDetail ( Request {
33
- content : slug,
34
- widget_name,
35
- request_id,
36
- } ) => get_question_details ( request_id, widget_name, slug, client) . await ,
37
- TaskRequest :: GetAllQuestionsMap ( Request {
38
- widget_name,
39
- request_id,
40
- ..
41
- } ) => get_all_questions ( request_id, widget_name, conn) . await ,
42
- TaskRequest :: GetAllTopicTags ( Request {
43
- widget_name,
44
- request_id,
45
- ..
46
- } ) => get_all_topic_tags ( request_id, widget_name, conn) . await ,
47
- TaskRequest :: GetQuestionEditorData ( Request {
48
- request_id,
49
- content,
50
- widget_name,
51
- } ) => get_editor_data ( request_id, widget_name, content, client) . await ,
52
- TaskRequest :: CodeRunRequest ( Request {
53
- request_id,
54
- content,
55
- widget_name,
56
- } ) => run_or_submit_question ( request_id, widget_name, content, client) . await ,
57
- TaskRequest :: DbUpdateQuestion ( Request {
58
- request_id,
59
- content,
60
- widget_name,
61
- } ) => update_status_to_accepted ( request_id, widget_name, content, conn) . await ,
25
+ macro_rules! impl_task_request {
26
+ ( $( ( $var: ident, $f_name: ident) ) ,* ) => {
27
+ impl TaskRequest {
28
+ pub async fn execute(
29
+ self ,
30
+ client: & reqwest:: Client ,
31
+ conn: & DatabaseConnection ,
32
+ ) -> TaskResponse {
33
+ match self {
34
+ $(
35
+ TaskRequest :: $var( Request {
36
+ content,
37
+ widget_name,
38
+ request_id,
39
+ } ) => $f_name( request_id, widget_name, content, client, conn) . await ,
40
+ ) *
41
+ }
42
+ }
62
43
}
63
- }
44
+ } ;
64
45
}
65
46
47
+ impl_task_request ! (
48
+ ( QuestionDetail , get_question_details) ,
49
+ ( GetAllQuestionsMap , get_all_questions) ,
50
+ ( GetAllTopicTags , get_all_topic_tags) ,
51
+ ( GetQuestionEditorData , get_editor_data) ,
52
+ ( CodeRunRequest , run_or_submit_question) ,
53
+ ( DbUpdateQuestion , update_status_to_accepted)
54
+ ) ;
55
+
66
56
#[ derive( Debug ) ]
67
57
pub struct Response < T > {
68
58
pub ( crate ) request_id : String ,
@@ -81,21 +71,31 @@ pub enum TaskResponse {
81
71
Error ( Response < String > ) ,
82
72
}
83
73
84
- impl TaskResponse {
85
- pub fn get_widget_name ( & self ) -> WidgetName {
86
- match self {
87
- TaskResponse :: QuestionDetail ( Response { widget_name, .. } ) => widget_name,
88
- TaskResponse :: GetAllQuestionsMap ( Response { widget_name, .. } ) => widget_name,
89
- TaskResponse :: AllTopicTags ( Response { widget_name, .. } ) => widget_name,
90
- TaskResponse :: Error ( Response { widget_name, .. } ) => widget_name,
91
- TaskResponse :: QuestionEditorData ( Response { widget_name, .. } ) => widget_name,
92
- TaskResponse :: RunResponseData ( Response { widget_name, .. } ) => widget_name,
93
- TaskResponse :: DbUpdateStatus ( Response { widget_name, .. } ) => widget_name,
74
+ macro_rules! impl_task_response {
75
+ ( $( $variant: ident) ,* ) => {
76
+ impl TaskResponse {
77
+ pub fn get_widget_name( & self ) -> WidgetName {
78
+ match self {
79
+ $(
80
+ TaskResponse :: $variant( Response { widget_name, .. } ) => widget_name,
81
+ ) *
82
+ }
83
+ . clone( )
84
+ }
94
85
}
95
- . clone ( )
96
- }
86
+ } ;
97
87
}
98
88
89
+ impl_task_response ! (
90
+ QuestionDetail ,
91
+ GetAllQuestionsMap ,
92
+ AllTopicTags ,
93
+ QuestionEditorData ,
94
+ RunResponseData ,
95
+ DbUpdateStatus ,
96
+ Error
97
+ ) ;
98
+
99
99
pub type ChannelRequestSender = tokio:: sync:: mpsc:: UnboundedSender < TaskRequest > ;
100
100
pub type ChannelRequestReceiver = tokio:: sync:: mpsc:: UnboundedReceiver < TaskRequest > ;
101
101
0 commit comments