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
//! Staged builder types.
use crate::{OnPoolDropBehavior, ScheduledThreadPool};
/// The builder stage expecting the `num_threads` value.
pub struct NumThreadsStage(pub(crate) ());
impl NumThreadsStage {
    /// Specifies the number of threads the pool should use.
    ///
    /// # Panics
    ///
    /// Panics if `num_threads` is 0.
    pub fn num_threads<'a>(self, num_threads: usize) -> FinalStage<'a> {
        assert!(num_threads > 0, "num_threads must be positive");
        FinalStage {
            num_threads,
            thread_name_pattern: None,
            on_drop_behavior: OnPoolDropBehavior::CompletePendingScheduled,
        }
    }
}
/// The final builder stage, allowing configuration of optional paramters.
pub struct FinalStage<'a> {
    pub(crate) num_threads: usize,
    pub(crate) thread_name_pattern: Option<&'a str>,
    pub(crate) on_drop_behavior: OnPoolDropBehavior,
}
impl<'a> FinalStage<'a> {
    /// Sets the pattern to be used when naming threads created to be part of the
    /// pool.
    ///
    /// The substring `{}` in the name will be replaced with an integer
    /// identifier of the thread.
    ///
    /// Defaults to `None`.
    pub fn thread_name_pattern(mut self, thread_name_pattern: &'a str) -> Self {
        self.thread_name_pattern = Some(thread_name_pattern);
        self
    }
    /// Sets the behavior for what to do with pending scheduled executions when
    /// the pool is dropped.
    ///
    /// Defaults to [OnPoolDropBehavior::CompletePendingScheduled].
    pub fn on_drop_behavior(mut self, on_drop_behavior: OnPoolDropBehavior) -> Self {
        self.on_drop_behavior = on_drop_behavior;
        self
    }
    /// Consumes the builder, returning the constructed thread pool.
    pub fn build(self) -> ScheduledThreadPool {
        ScheduledThreadPool::new_inner(self)
    }
}