@@ -209,29 +209,35 @@ pub fn pull_version(version: &str) -> Result<(), CaveError> {
209209}
210210
211211
212- /// Runs code_aster with Docker with the given version, optional export file, and arguments.
213- /// Envoie ensuite les données d'exécution via gRPC si l'exécution n'est pas interactive.
212+ pub enum DockerMode < ' a > {
213+ RunAster { export_file : & ' a Option < String > , args : & ' a Vec < String > } ,
214+ Shell ,
215+ }
216+
217+ /// Runs code_aster with Docker with the given version and mode.
218+ ///
219+ /// - [`DockerMode::RunAster`]: sources the activate script and runs `run_aster` with the given args and export file.
220+ /// - [`DockerMode::Shell`]: drops the user into an interactive bash shell inside the container.
214221///
215222/// # Example
216223/// ```
217- /// docker_aster("22.0", &Some("output.msh".to_string()), &vec!["command".to_string()] )
224+ /// docker_aster("22.0", DockerMode::RunAster { export_file: &Some("output.msh".to_string()), args: &vec![] } )
218225/// .expect("Failed to run Code_Aster in Docker");
226+ /// docker_aster("22.0", DockerMode::Shell).expect("Failed to start shell");
219227/// ```
220- pub fn docker_aster ( version : & str , export_file : & Option < String > , args : & Vec < String > ) -> Result < ( ) , CaveError > {
228+ pub fn docker_aster ( version : & str , mode : DockerMode ) -> Result < ( ) , CaveError > {
221229 let start = std:: time:: Instant :: now ( ) ;
222230
223231 let current_dir = std:: env:: current_dir ( ) . map_err ( CaveError :: IoError ) ?;
224232 let volume_arg = format ! ( "{}:/home/user/data" , current_dir. display( ) ) ;
225233 let image = format ! ( "simvia/code_aster:{}" , version) ;
226- let export = export_file. clone ( ) . unwrap_or_default ( ) ;
227- let docker_command = format ! ( "source /opt/activate.sh && run_aster {} {}" , args. join( " " ) , export) ;
228234
229235 // Get the current user's UID and GID to avoid permission issues
230236 let ( uid, gid) = get_uid_gid ( ) ;
231237 let user_arg = format ! ( "{}:{}" , uid, gid) ;
232238
233- let mut child = Command :: new ( "docker" )
234- . arg ( "run" )
239+ let mut cmd = Command :: new ( "docker" ) ;
240+ cmd . arg ( "run" )
235241 . arg ( "--rm" )
236242 . arg ( "-it" )
237243 . arg ( "--user" )
@@ -240,11 +246,22 @@ pub fn docker_aster(version: &str, export_file: &Option<String>, args: &Vec<Stri
240246 . arg ( & volume_arg)
241247 . arg ( "-w" )
242248 . arg ( "/home/user/data" )
243- . arg ( & image)
244- . arg ( "/bin/bash" )
245- . arg ( "-i" )
246- . arg ( "-c" )
247- . arg ( & docker_command)
249+ . arg ( & image) ;
250+
251+ let is_shell = matches ! ( mode, DockerMode :: Shell ) ;
252+
253+ match mode {
254+ DockerMode :: RunAster { export_file, args } => {
255+ let export = export_file. clone ( ) . unwrap_or_default ( ) ;
256+ let docker_command = format ! ( "source /opt/activate.sh && run_aster {} {}" , args. join( " " ) , export) ;
257+ cmd. arg ( "/bin/bash" ) . arg ( "-i" ) . arg ( "-c" ) . arg ( docker_command) ;
258+ }
259+ DockerMode :: Shell => {
260+ cmd. arg ( "/bin/bash" ) ;
261+ }
262+ }
263+
264+ let mut child = cmd
248265 . stdin ( Stdio :: inherit ( ) )
249266 . stdout ( Stdio :: inherit ( ) )
250267 . stderr ( Stdio :: inherit ( ) )
@@ -258,9 +275,8 @@ pub fn docker_aster(version: &str, export_file: &Option<String>, args: &Vec<Stri
258275 } ) ?;
259276
260277 let status = child. wait ( ) . map_err ( CaveError :: IoError ) ?;
261- let interactive = args. contains ( & "-i" . to_string ( ) ) ;
262278
263- if !interactive {
279+ if !is_shell {
264280 debug ! ( "Début de la telemetry" ) ;
265281 debug ! ( "Début de la collecte des données du run" ) ;
266282
0 commit comments