@@ -13,6 +13,28 @@ pub fn routes() -> Vec<rocket::Route> {
1313 rocket:: routes![ get_index, get_tree, post_tree]
1414}
1515
16+ #[ derive( Debug , serde:: Serialize ) ]
17+ struct PostTreeResponse {
18+ message : String ,
19+ #[ serde( skip_serializing_if = "Option::is_none" ) ] skip_breakpoint : Option < i32 > ,
20+ }
21+
22+ impl PostTreeResponse {
23+ fn new ( msg : impl Into < String > , skips : i32 ) -> Json < PostTreeResponse > {
24+ Json ( PostTreeResponse {
25+ message : msg. into ( ) ,
26+ skip_breakpoint : Some ( skips) ,
27+ } )
28+ }
29+
30+ fn no_skips ( msg : impl Into < String > ) -> Json < PostTreeResponse > {
31+ Json ( PostTreeResponse {
32+ message : msg. into ( ) ,
33+ skip_breakpoint : None ,
34+ } )
35+ }
36+ }
37+
1638/* Placeholder GET request handler to print 'Hello world!' */
1739#[ get( "/" ) ]
1840fn get_index ( ) -> String {
@@ -21,14 +43,15 @@ fn get_index() -> String {
2143
2244/* Post request handler to accept debug tree */
2345#[ post( "/api/remote/tree" , format = "application/json" , data = "<data>" ) ]
24- fn post_tree ( data : Json < ParsleyTree > , state : & rocket:: State < ServerState > ) -> ( http:: Status , String ) {
46+ async fn post_tree ( data : Json < ParsleyTree > , state : & rocket:: State < ServerState > ) -> ( http:: Status , Json < PostTreeResponse > ) {
2547 /* Deserialise and unwrap json data */
2648 let parsley_tree: ParsleyTree = data. into_inner ( ) ;
49+ let is_debugging: bool = parsley_tree. is_debugging ( ) ;
2750 let debug_tree: DebugTree = parsley_tree. into ( ) ;
2851
2952 /* Format informative response for RemoteView */
3053 let input: & str = debug_tree. get_input ( ) ;
31- let response : String = format ! (
54+ let message : String = format ! (
3255 "Posted parser tree handling input: \" {}{}\" to Dill" ,
3356 /* Include first few chars of input */
3457 & input[ ..std:: cmp:: min( input. len( ) , RESPONSE_INPUT_LEN ) ] ,
@@ -41,13 +64,23 @@ fn post_tree(data: Json<ParsleyTree>, state: &rocket::State<ServerState>) -> (ht
4164
4265 /* Update state with new debug_tree and return response */
4366 match state. set_tree ( debug_tree) . and ( state. emit ( Event :: NewTree ) ) {
44- Ok ( ( ) ) => ( http:: Status :: Ok , response) ,
45-
46- Err ( StateError :: EventEmitFailed ) =>
47- ( http:: Status :: InternalServerError , String :: from ( "New Tree event could not be emitted - try again" ) ) ,
67+ Ok ( ( ) ) => {
68+ if !is_debugging {
69+ return ( http:: Status :: Ok , PostTreeResponse :: no_skips ( message) )
70+ } ;
71+
72+ match state. receive_breakpoint_skips ( ) . await {
73+ Some ( skips) => ( http:: Status :: Ok , PostTreeResponse :: new ( message, skips) ) ,
74+ None => ( http:: Status :: InternalServerError , PostTreeResponse :: no_skips ( message) ) ,
75+ }
4876
77+ } ,
78+
4979 Err ( StateError :: LockFailed ) =>
50- ( http:: Status :: InternalServerError , String :: from ( "Locking state mutex failed - try again" ) ) ,
80+ ( http:: Status :: InternalServerError , PostTreeResponse :: no_skips ( "Locking state mutex failed - try again" ) ) ,
81+
82+ Err ( StateError :: ChannelError ) =>
83+ ( http:: Status :: InternalServerError , PostTreeResponse :: no_skips ( "Failed to receive value from channel - try again" ) ) ,
5184
5285 Err ( _) => panic ! ( "Unexpected error on post_tree" ) ,
5386 }
@@ -64,6 +97,7 @@ fn get_tree(state: &rocket::State<ServerState>) -> String {
6497 }
6598}
6699
100+
67101#[ cfg( test) ]
68102pub mod test {
69103
0 commit comments