Skip to main content

wslplugins_rs/wsl_user_configuration/
enumflags2.rs

1//! Provides an [enumflags2] implementation for [`WSLUserConfiguration`] flags.
2use super::WSLUserConfiguration;
3use enumflags2::{bitflags, BitFlags};
4
5/// Represents the user configuration flags for Windows Subsystem for Linux (WSL) as
6/// [enumflags2]
7///
8/// These flags are used to customize the behavior of WSL instances based on user configuration.
9/// The values correspond to the definitions in the WSL Plugin API provided by Microsoft.
10///
11/// # Variants
12///
13/// - `CustomKernel`: Indicates that the WSL instance use use a custom Linux kernel instead of the default kernel.
14/// - `CustomKernelCommandLine`: Specifies that the WSL instance use use a custom kernel command-line during boot.
15///
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#[bitflags]
22#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
23#[repr(u32)]
24pub enum WSLUserConfigurationFlags {
25    /// A custom Linux kernel is used for the WSL instance.
26    CustomKernel = wslpluginapi_sys::WSLUserConfiguration_WSLUserConfigurationCustomKernel as u32,
27
28    /// A custom kernel command-line is used for the WSL instance.
29    CustomKernelCommandLine =
30        wslpluginapi_sys::WSLUserConfiguration_WSLUserConfigurationCustomKernelCommandLine as u32,
31}
32
33impl From<WSLUserConfiguration> for BitFlags<WSLUserConfigurationFlags> {
34    #[inline]
35    fn from(value: WSLUserConfiguration) -> Self {
36        BitFlags::from_bits_truncate(value.0.cast_unsigned())
37    }
38}
39
40impl From<BitFlags<WSLUserConfigurationFlags>> for WSLUserConfiguration {
41    #[inline]
42    fn from(value: BitFlags<WSLUserConfigurationFlags>) -> Self {
43        (value.bits().cast_signed()).into()
44    }
45}
46
47impl WSLUserConfiguration {
48    /// Converts the [`WSLUserConfiguration`] into a [`BitFlags`] of (`WSLUserConfigurationFlags`).
49    #[inline]
50    #[must_use]
51    pub fn into_enumflags2(self) -> BitFlags<WSLUserConfigurationFlags> {
52        BitFlags::from(self)
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use super::*;
59    use enumflags2::BitFlags;
60    #[test]
61    fn test_default_enumflags2() {
62        let default_config = BitFlags::<WSLUserConfigurationFlags>::default();
63        assert_eq!(default_config, BitFlags::empty());
64        assert!(default_config.is_empty());
65    }
66
67    #[test]
68    fn test_set_and_clear_enumflags2() {
69        let mut config = BitFlags::<WSLUserConfigurationFlags>::default();
70        config.insert(WSLUserConfigurationFlags::CustomKernel);
71        assert!(config.contains(WSLUserConfigurationFlags::CustomKernel));
72        config.remove(WSLUserConfigurationFlags::CustomKernel);
73        assert!(!config.contains(WSLUserConfigurationFlags::CustomKernel));
74    }
75
76    #[test]
77    fn test_multiple_flags_enumflags2() {
78        let mut config = BitFlags::<WSLUserConfigurationFlags>::default();
79        config.insert(
80            WSLUserConfigurationFlags::CustomKernel
81                | WSLUserConfigurationFlags::CustomKernelCommandLine,
82        );
83        assert!(config.contains(WSLUserConfigurationFlags::CustomKernel));
84        assert!(config.contains(WSLUserConfigurationFlags::CustomKernelCommandLine));
85        config.remove(WSLUserConfigurationFlags::CustomKernel);
86        assert!(!config.contains(WSLUserConfigurationFlags::CustomKernel));
87        assert!(config.contains(WSLUserConfigurationFlags::CustomKernelCommandLine));
88    }
89
90    #[test]
91    fn test_conversion_between_flags_and_configuration() {
92        let config = WSLUserConfiguration(3); // Assuming 3 = CustomKernel | CustomKernelCommandLine
93        let flags: BitFlags<WSLUserConfigurationFlags> = config.into();
94        assert!(flags.contains(WSLUserConfigurationFlags::CustomKernel));
95        assert!(flags.contains(WSLUserConfigurationFlags::CustomKernelCommandLine));
96
97        let back_to_config: WSLUserConfiguration = flags.into();
98        assert_eq!(back_to_config, WSLUserConfiguration(3));
99    }
100}