@@ -2,59 +2,64 @@ use std::sync::mpsc::{Receiver, Sender};
2
2
3
3
use anyhow:: { bail, Context } ;
4
4
use futures:: StreamExt ;
5
- use interfaces:: CommandData ;
6
5
use serde_json:: Value ;
7
6
use tokio:: net:: { TcpListener , TcpStream } ;
8
7
use tokio_tungstenite:: WebSocketStream ;
8
+ use tracing:: error;
9
9
10
10
/// commands received over websocket (typically forge mod)
11
11
pub struct CommandReceiver {
12
- pub pending : Receiver < CommandData > ,
12
+ pub pending : Receiver < TaggedValue > ,
13
13
}
14
14
15
- fn process ( path : & str , value : Value ) -> Option < CommandData > {
16
- macro_rules! parse {
17
- ( ) => { {
18
- serde_json:: from_value( value) . unwrap( )
19
- } } ;
20
- }
15
+ struct Processor {
16
+ value : Value ,
17
+ }
21
18
22
- match path {
23
- "mine" => Some ( CommandData :: Mine ( parse ! ( ) ) ) ,
24
- "goto" => Some ( CommandData :: GoTo ( parse ! ( ) ) ) ,
25
- "attack" => Some ( CommandData :: Attack ( parse ! ( ) ) ) ,
19
+ pub struct TaggedValue {
20
+ pub path : String ,
21
+ pub value : Value ,
22
+ }
26
23
27
- path => {
28
- println ! ( "invalid {path}" ) ;
29
- None
30
- }
24
+ impl TaggedValue {
25
+ pub fn parse < T > ( self ) -> Result < T , serde_json:: Error >
26
+ where
27
+ T : serde:: de:: DeserializeOwned ,
28
+ {
29
+ serde_json:: from_value ( self . value )
31
30
}
32
31
}
33
32
34
33
async fn command_receiver (
35
- tx : Sender < CommandData > ,
34
+ tx : Sender < TaggedValue > ,
36
35
mut ws : WebSocketStream < TcpStream > ,
37
36
) -> anyhow:: Result < ( ) > {
38
- ' wloop : while let Some ( msg) = ws. next ( ) . await {
37
+ while let Some ( msg) = ws. next ( ) . await {
39
38
let msg = msg. context ( "error reading next web socket message (websocket disconnect?)" ) ?;
40
39
41
40
let text = msg. into_text ( ) . unwrap ( ) ;
42
41
43
- let mut v: Value = match serde_json:: from_str ( & text) {
42
+ let v: Value = match serde_json:: from_str ( & text) {
44
43
Ok ( v) => v,
45
- Err ( _e) => continue ' wloop,
44
+ Err ( e) => {
45
+ error ! ( "invalid json {e}" ) ;
46
+ continue ;
47
+ }
46
48
} ;
47
49
48
- let Value :: Object ( map) = & mut v else {
49
- bail ! ( "invalid value " )
50
+ let Value :: Object ( mut map) = v else {
51
+ bail ! ( "expected object " )
50
52
} ;
51
53
52
54
let Value :: String ( path) = map. remove ( "path" ) . expect ( "no path elem" ) else {
53
55
bail ! ( "invalid path" )
54
56
} ;
55
57
56
- let command = process ( & path, v) . expect ( "invalid command" ) ;
57
- tx. send ( command) . unwrap ( ) ;
58
+ let value = Value :: Object ( map) ;
59
+
60
+ let elem = TaggedValue { path, value } ;
61
+
62
+ tx. send ( elem) . unwrap ( ) ;
58
63
}
59
64
Ok ( ( ) )
60
65
}
0 commit comments