Skip to main content

fret_runtime/capabilities/
exec.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
4#[serde(rename_all = "snake_case")]
5pub enum ExecBackgroundWork {
6    #[default]
7    Threads,
8    Cooperative,
9    None,
10}
11
12impl ExecBackgroundWork {
13    pub fn as_str(self) -> &'static str {
14        match self {
15            Self::None => "none",
16            Self::Cooperative => "cooperative",
17            Self::Threads => "threads",
18        }
19    }
20
21    pub fn clamp_to_available(self, available: Self) -> Self {
22        use ExecBackgroundWork::*;
23        match (self, available) {
24            (None, _) => None,
25            (_, None) => None,
26            (Cooperative, Cooperative | Threads) => Cooperative,
27            (Threads, Threads) => Threads,
28            (Threads, Cooperative) => Cooperative,
29        }
30    }
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
34#[serde(rename_all = "snake_case")]
35pub enum ExecWake {
36    #[default]
37    Reliable,
38    BestEffort,
39    None,
40}
41
42impl ExecWake {
43    pub fn as_str(self) -> &'static str {
44        match self {
45            Self::None => "none",
46            Self::BestEffort => "best_effort",
47            Self::Reliable => "reliable",
48        }
49    }
50
51    pub fn clamp_to_available(self, available: Self) -> Self {
52        use ExecWake::*;
53        match (self, available) {
54            (None, _) => None,
55            (_, None) => None,
56            (BestEffort, BestEffort | Reliable) => BestEffort,
57            (Reliable, Reliable) => Reliable,
58            (Reliable, BestEffort) => BestEffort,
59        }
60    }
61}
62
63#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
64#[serde(rename_all = "snake_case")]
65pub enum ExecTimers {
66    #[default]
67    Reliable,
68    BestEffort,
69    None,
70}
71
72impl ExecTimers {
73    pub fn as_str(self) -> &'static str {
74        match self {
75            Self::None => "none",
76            Self::BestEffort => "best_effort",
77            Self::Reliable => "reliable",
78        }
79    }
80
81    pub fn clamp_to_available(self, available: Self) -> Self {
82        use ExecTimers::*;
83        match (self, available) {
84            (None, _) => None,
85            (_, None) => None,
86            (BestEffort, BestEffort | Reliable) => BestEffort,
87            (Reliable, Reliable) => Reliable,
88            (Reliable, BestEffort) => BestEffort,
89        }
90    }
91}
92
93#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
94#[serde(default)]
95pub struct ExecCapabilities {
96    pub background_work: ExecBackgroundWork,
97    pub wake: ExecWake,
98    pub timers: ExecTimers,
99}