Skip to main content

dope_core/driver/settings/config/
mod.rs

1use crate::driver::{settings, settings::errors};
2
3mod layout;
4pub(super) mod plan;
5
6#[derive(Clone, Copy, PartialEq, Eq)]
7pub struct Config {
8    queues: settings::QueueLayout,
9    schedule: settings::Schedule,
10    files: settings::FileSlots,
11    recv: settings::Receive,
12    domains: settings::Domain,
13    progress: settings::Progress,
14}
15
16impl Default for Config {
17    fn default() -> Self {
18        const FILES: settings::FileSlots = settings::FileSlots::fixed::<0, 256>();
19        Self::new(
20            settings::QueueLayout::fixed::<1024, 2048>(),
21            settings::Schedule::fixed::<{ u16::MAX as u32 - FILES.capacity().raw() }, 65_536>(),
22            FILES,
23            settings::Receive::fixed::<128, 4096>(),
24            settings::Domain::ZERO,
25            settings::Progress::Prompt,
26        )
27    }
28}
29
30impl Config {
31    /// Assembles validated fields; driver creation checks their relationships.
32    pub const fn new(
33        queues: settings::QueueLayout,
34        schedule: settings::Schedule,
35        files: settings::FileSlots,
36        recv: settings::Receive,
37        domains: settings::Domain,
38        progress: settings::Progress,
39    ) -> Self {
40        Self {
41            queues,
42            schedule,
43            files,
44            recv,
45            domains,
46            progress,
47        }
48    }
49
50    #[must_use]
51    pub const fn file_slots(&self) -> settings::FileSlots {
52        self.files
53    }
54
55    #[must_use]
56    pub const fn queue_layout(&self) -> settings::QueueLayout {
57        self.queues
58    }
59
60    #[must_use]
61    pub const fn schedule(&self) -> settings::Schedule {
62        self.schedule
63    }
64
65    #[must_use]
66    pub const fn progress(&self) -> settings::Progress {
67        self.progress
68    }
69
70    #[must_use]
71    pub const fn with_files(mut self, files: settings::FileSlots) -> Self {
72        self.files = files;
73        self
74    }
75
76    #[must_use]
77    pub const fn receive(&self) -> settings::Receive {
78        self.recv
79    }
80
81    /// Number of stable resident-accounting domains provisioned for one
82    /// generative driver scope.
83    #[must_use]
84    pub const fn domains(&self) -> settings::Domain {
85        self.domains
86    }
87
88    #[must_use]
89    pub const fn with_domains(mut self, domains: settings::Domain) -> Self {
90        self.domains = domains;
91        self
92    }
93
94    #[must_use]
95    pub const fn with_queues(mut self, queues: settings::QueueLayout) -> Self {
96        self.queues = queues;
97        self
98    }
99
100    #[must_use]
101    pub const fn set_schedule(mut self, schedule: settings::Schedule) -> Self {
102        self.schedule = schedule;
103        self
104    }
105
106    /// Materializes a statically validated profile baseline.
107    #[must_use]
108    pub const fn for_profile<P: settings::Profile>() -> Self {
109        const {
110            let config = Self::new(
111                P::QUEUES,
112                P::SCHEDULER,
113                P::FILES,
114                P::RECEIVE,
115                P::RESIDENT_DOMAINS,
116                P::COMPLETION_PROGRESS,
117            );
118            assert!(plan::Plan::new(config).is_ok(), "capacity");
119            config
120        }
121    }
122
123    #[must_use]
124    pub fn with_receive(mut self, receive: settings::Receive) -> Self {
125        self.recv = receive;
126        self
127    }
128
129    /// Validates cross-field relationships before any driver allocation or I/O.
130    pub(crate) fn into_plan(self) -> Result<settings::Plan, errors::Config> {
131        settings::Plan::new(self)
132    }
133}
134
135const _: () = {
136    assert!(std::mem::align_of::<Config>() == std::mem::align_of::<u32>());
137};