nextest_runner/config/
track_default.rs

1// Copyright (c) The nextest Contributors
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4use serde::{Deserialize, Deserializer};
5
6/// Tracks if a particular default is implicit.
7///
8/// The `default` impl can be passed in to `serde` directly, if desired.
9///
10/// This could be its own crate maybe?
11#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
12pub(crate) struct TrackDefault<T> {
13    /// The deserialized or default value.
14    pub value: T,
15    /// Whether the value was deserialized.
16    pub is_deserialized: bool,
17}
18
19impl<T> TrackDefault<T> {
20    pub fn with_default_value(value: T) -> Self {
21        Self {
22            value,
23            is_deserialized: false,
24        }
25    }
26
27    pub fn with_deserialized_value(value: T) -> Self {
28        Self {
29            value,
30            is_deserialized: true,
31        }
32    }
33}
34
35impl<'de, T> Deserialize<'de> for TrackDefault<T>
36where
37    T: Deserialize<'de>,
38{
39    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
40    where
41        D: Deserializer<'de>,
42    {
43        let value = Self::with_deserialized_value(T::deserialize(deserializer)?);
44        Ok(value)
45    }
46}