aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe-external-packages/src/symfony/process/exception/process_timed_out_exception.rs
blob: 45cb6939a4fa5e428862021845ca65bdaa9f3d9b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//! ref: composer/vendor/symfony/process/Exception/ProcessTimedOutException.php

use crate::symfony::process::process::Process;

#[derive(Debug)]
pub struct ProcessTimedOutException {
    pub message: String,
    pub code: i64,
    timeout_type: i64,
    exceeded_timeout: Option<f64>,
}

impl ProcessTimedOutException {
    pub const TYPE_GENERAL: i64 = 1;
    pub const TYPE_IDLE: i64 = 2;

    pub fn new(process: &Process, timeout_type: i64) -> Self {
        let exceeded_timeout = match timeout_type {
            Self::TYPE_GENERAL => process.get_timeout(),
            Self::TYPE_IDLE => process.get_idle_timeout(),
            _ => panic!("Unknown timeout type \"{}\".", timeout_type),
        };

        let message = format!(
            "The process \"{}\" exceeded the timeout of {} seconds.",
            process.get_command_line(),
            exceeded_timeout.map(|t| t.to_string()).unwrap_or_default(),
        );

        Self {
            message,
            code: 0,
            timeout_type,
            exceeded_timeout,
        }
    }

    pub fn is_general_timeout(&self) -> bool {
        Self::TYPE_GENERAL == self.timeout_type
    }

    pub fn is_idle_timeout(&self) -> bool {
        Self::TYPE_IDLE == self.timeout_type
    }

    pub fn get_exceeded_timeout(&self) -> Option<f64> {
        self.exceeded_timeout
    }
}

impl std::fmt::Display for ProcessTimedOutException {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.message)
    }
}

impl std::error::Error for ProcessTimedOutException {}