Skip to main content

wslplugins_rs/wsl_user_configuration/
flagset.rs

1//! Provides an [`flagset`] implementation for [`WSLUserConfiguration`] flags.
2use super::WSLUserConfiguration;
3use flagset::{flags, FlagSet};
4
5flags! {
6    /// Represents the user configuration flags for Windows Subsystem for Linux (WSL) as
7    /// [flagset]
8    ///
9    /// These flags are used to customize the behavior of WSL instances based on user configuration.
10    /// The values correspond to the definitions in the WSL Plugin API provided by Microsoft.
11    ///
12    /// # Variants
13    ///
14    /// - `CustomKernel`: Indicates that the WSL instance use use a custom Linux kernel instead of the default kernel.
15    /// - `CustomKernelCommandLine`: Specifies that the WSL instance use use a custom kernel command-line during boot.
16    ///
17    /// # References
18    ///
19    /// See [WSL Configuration](https://learn.microsoft.com/windows/wsl/wsl-config)
20    /// for additional details on WSL user configurations.
21    #[derive(Hash)]
22    pub enum WSLUserConfigurationFlags: i32 {
23        /// A custom Linux kernel is used for the WSL instance.
24        CustomKernel = wslpluginapi_sys::WSLUserConfiguration_WSLUserConfigurationCustomKernel,
25        /// A custom kernel command-line is used for the WSL instance.
26        CustomKernelCommandLine =
27            wslpluginapi_sys::WSLUserConfiguration_WSLUserConfigurationCustomKernelCommandLine,
28    }
29}
30
31impl From<WSLUserConfiguration> for FlagSet<WSLUserConfigurationFlags> {
32    #[inline]
33    fn from(value: WSLUserConfiguration) -> Self {
34        Self::new_truncated(value.0)
35    }
36}
37
38impl From<FlagSet<WSLUserConfigurationFlags>> for WSLUserConfiguration {
39    #[inline]
40    fn from(value: FlagSet<WSLUserConfigurationFlags>) -> Self {
41        Self::from(value.bits())
42    }
43}
44
45impl WSLUserConfiguration {
46    /// Converts the [`WSLUserConfiguration`] into a [`FlagSet`] of (`WSLUserConfigurationFlags`).
47    #[inline]
48    #[must_use]
49    pub fn into_flagset(self) -> FlagSet<WSLUserConfigurationFlags> {
50        FlagSet::from(self)
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57
58    #[test]
59    fn test_default_flagset() {
60        let default_config = FlagSet::<WSLUserConfigurationFlags>::default();
61        assert_eq!(default_config, FlagSet::default());
62        assert!(default_config.is_empty());
63    }
64
65    #[test]
66    fn test_set_and_clear_flagset() {
67        let mut config = FlagSet::<WSLUserConfigurationFlags>::default();
68        config |= WSLUserConfigurationFlags::CustomKernel;
69        assert!(config.contains(WSLUserConfigurationFlags::CustomKernel));
70        config &= !WSLUserConfigurationFlags::CustomKernel;
71        assert!(!config.contains(WSLUserConfigurationFlags::CustomKernel));
72    }
73
74    #[test]
75    fn test_multiple_flags_flagset() {
76        let mut config = FlagSet::<WSLUserConfigurationFlags>::default();
77        config |= WSLUserConfigurationFlags::CustomKernel
78            | WSLUserConfigurationFlags::CustomKernelCommandLine;
79        assert!(config.contains(WSLUserConfigurationFlags::CustomKernel));
80        assert!(config.contains(WSLUserConfigurationFlags::CustomKernelCommandLine));
81        config &= !WSLUserConfigurationFlags::CustomKernel;
82        assert!(!config.contains(WSLUserConfigurationFlags::CustomKernel));
83        assert!(config.contains(WSLUserConfigurationFlags::CustomKernelCommandLine));
84    }
85
86    #[test]
87    fn test_conversion_between_flags_and_configuration() {
88        let config = WSLUserConfiguration(3); // Assuming 3 = CustomKernel | CustomKernelCommandLine
89        let flags: FlagSet<WSLUserConfigurationFlags> = config.into();
90        assert!(flags.contains(WSLUserConfigurationFlags::CustomKernel));
91        assert!(flags.contains(WSLUserConfigurationFlags::CustomKernelCommandLine));
92
93        let back_to_config: WSLUserConfiguration = flags.into();
94        assert_eq!(back_to_config, WSLUserConfiguration(3));
95    }
96}