1
1
use super :: { AppState , Error , User } ;
2
2
use crate :: game:: { GameState , Move , Player } ;
3
- use async_process:: { Child , ChildStdin , ChildStdout } ;
3
+ use async_process:: { Child , ChildStderr , ChildStdin , ChildStdout } ;
4
4
use rocket:: {
5
5
futures:: { io:: BufReader , AsyncBufReadExt , AsyncWriteExt } ,
6
6
get, post,
@@ -14,6 +14,7 @@ pub struct Game {
14
14
handle : Child ,
15
15
stdin : ChildStdin ,
16
16
stdout : BufReader < ChildStdout > ,
17
+ stderr : BufReader < ChildStderr > ,
17
18
checkers : GameState ,
18
19
human_player : Player ,
19
20
}
@@ -72,24 +73,40 @@ pub async fn start(
72
73
user : User ,
73
74
is_first_player : bool ,
74
75
) -> Result < Json < GameState > , Error > {
75
- let mut lock = state. lock ( ) . unwrap ( ) ;
76
+ let game = {
77
+ let lock = state. lock ( ) . unwrap ( ) ;
78
+ lock. games . get ( & user. name ) . cloned ( )
79
+ } ;
76
80
77
- if lock. games . contains_key ( & user. name ) {
78
- return Err ( Error :: GameAlreadyInProgress ) ;
81
+ if let Some ( game) = game {
82
+ if game. lock ( ) . await . handle . try_status ( ) ?. is_none ( ) {
83
+ return Err ( Error :: GameAlreadyInProgress ) ;
84
+ }
79
85
}
80
86
81
- let mut child = lock
82
- . submissions
83
- . get ( & user. name )
84
- . ok_or ( Error :: NotFound ) ?
85
- . start ( ) ?;
86
- let checkers: GameState = Default :: default ( ) ;
87
+ let mut child = {
88
+ let lock = state. lock ( ) . unwrap ( ) ;
89
+ lock. submissions
90
+ . get ( & user. name )
91
+ . ok_or ( Error :: NotFound ) ?
92
+ . start ( ) ?
93
+ } ;
94
+ let mut checkers: GameState = Default :: default ( ) ;
87
95
96
+ let mut stderr = BufReader :: new ( child. stderr . take ( ) . unwrap ( ) ) ;
97
+
98
+ let mut output = vec ! [ ] ;
99
+ stderr. read_until ( 1 , & mut output) . await ?;
100
+
101
+ checkers. ai_output = String :: from_utf8_lossy ( & output) . to_string ( ) ;
102
+
103
+ let mut lock = state. lock ( ) . unwrap ( ) ;
88
104
lock. games . insert (
89
105
user. name ,
90
106
Arc :: new ( Mutex :: new ( Game {
91
107
stdin : child. stdin . take ( ) . unwrap ( ) ,
92
108
stdout : BufReader :: new ( child. stdout . take ( ) . unwrap ( ) ) ,
109
+ stderr,
93
110
handle : child,
94
111
human_player : if is_first_player {
95
112
Player :: White
0 commit comments