//! Configuration types

use std::time::Duration;

/// Indicates whether only the provided directory or its sub-directories as well should be watched
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
pub enum RecursiveMode {
    /// Watch all sub-directories as well, including directories created after installing the watch
    Recursive,

    /// Watch only the provided directory
    NonRecursive,
}

impl RecursiveMode {
    pub(crate) fn is_recursive(&self) -> bool {
        match *self {
            RecursiveMode::Recursive => true,
            RecursiveMode::NonRecursive => false,
        }
    }
}

/// Runtime configuration items for watchers.
///
/// See the [`Watcher::configure`](../trait.Watcher.html#tymethod.configure) method for usage.
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Config {
    /// Enable or disable emitting precise event classification.
    ///
    /// Applicable to all watchers.
    ///
    /// When enabled, events are emitted with a `kind` set to as much precision about what kind of
    /// event they are as the backend is capable of providing. When disabled (default), events are
    /// instead emitted as `EventKind::Any`. `EventKind::Other` meta-events are left alone.
    PreciseEvents(bool),

    /// Enable or disable emitting `Notice` events.
    ///
    /// Applicable to debounced watchers only.
    ///
    /// When enabled, the first modify or remove event for a path is emitted immediately with a
    /// [`Flag::Notice`](../event/enum.Flag.html) attribute within a debouncing period, enabling
    /// applications to respond more quickly.
    NoticeEvents(bool),

    /// Enable or disable emitting `Ongoing` events.
    ///
    /// Applicable to debounced watchers only.
    ///
    /// When enabled, partial write events that are received after a `Modify(Data)` Notice but
    /// before the end of a debouncing period (and the emission of a `Modify(Data)` event) are
    /// passed through as `Modify(Data)` events with an `Ongoing` flag. These events are still
    /// debounced, but at a lower (configurable) interval than the debouncing interval.
    ///
    /// To enable, provide `Some(Duration)`. To disable, provide `None`.
    ///
    /// # Errors
    ///
    /// - `InvalidConfigValue` if the interval provided is higher than the debounce interval.
    OngoingEvents(Option<Duration>),
}
