Skip to main content

wslplugins_rs/wsl_user_configuration/
bitflags.rs

1//! Provides a [mod@bitflags] implementation for [`WSLUserConfiguration`] flags.
2use super::WSLUserConfiguration;
3use bitflags::bitflags;
4
5bitflags! {
6    /// Represents the user configuration flags for Windows Subsystem for Linux (WSL) as
7    /// [mod@bitflags]
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(Clone, Copy, Debug, PartialEq, Eq, Hash)]
22    pub struct WSLUserConfigurationFlags: i32 {
23        /// A custom Linux kernel is used for the WSL instance.
24        const CustomKernel = wslpluginapi_sys::WSLUserConfiguration_WSLUserConfigurationCustomKernel;
25        /// A custom kernel command-line is used for the WSL instance.
26        const CustomKernelCommandLine = wslpluginapi_sys::WSLUserConfiguration_WSLUserConfigurationCustomKernelCommandLine;
27    }
28}
29
30impl From<WSLUserConfiguration> for WSLUserConfigurationFlags {
31    #[inline]
32    fn from(value: WSLUserConfiguration) -> Self {
33        Self::from_bits_truncate(value.0)
34    }
35}
36
37impl WSLUserConfiguration {
38    /// Converts the [`WSLUserConfiguration`] into a [`WSLUserConfigurationFlags`]..
39    #[inline]
40    #[must_use]
41    pub fn into_bitflags(self) -> WSLUserConfigurationFlags {
42        WSLUserConfigurationFlags::from(self)
43    }
44}
45
46impl From<WSLUserConfigurationFlags> for WSLUserConfiguration {
47    #[inline]
48    fn from(value: WSLUserConfigurationFlags) -> Self {
49        value.bits().into()
50    }
51}
52
53impl Default for WSLUserConfigurationFlags {
54    #[inline]
55    fn default() -> Self {
56        Self::empty()
57    }
58}
59
60#[cfg(test)]
61mod tests {
62    use super::*;
63    #[test]
64    fn test_default_bitflags() {
65        let default_config = WSLUserConfigurationFlags::default();
66        assert_eq!(default_config, WSLUserConfigurationFlags::empty());
67        assert!(default_config.is_empty());
68    }
69
70    #[test]
71    fn test_set_and_clear_bitflags() {
72        let mut config = WSLUserConfigurationFlags::default();
73        config.insert(WSLUserConfigurationFlags::CustomKernel);
74        assert!(config.contains(WSLUserConfigurationFlags::CustomKernel));
75        config.remove(WSLUserConfigurationFlags::CustomKernel);
76        assert!(!config.contains(WSLUserConfigurationFlags::CustomKernel));
77    }
78
79    #[test]
80    fn test_multiple_flags_bitflags() {
81        let mut config = WSLUserConfigurationFlags::default();
82        config.insert(
83            WSLUserConfigurationFlags::CustomKernel
84                | WSLUserConfigurationFlags::CustomKernelCommandLine,
85        );
86        assert!(config.contains(WSLUserConfigurationFlags::CustomKernel));
87        assert!(config.contains(WSLUserConfigurationFlags::CustomKernelCommandLine));
88        config.remove(WSLUserConfigurationFlags::CustomKernel);
89        assert!(!config.contains(WSLUserConfigurationFlags::CustomKernel));
90        assert!(config.contains(WSLUserConfigurationFlags::CustomKernelCommandLine));
91    }
92
93    #[test]
94    fn test_conversion_between_flags_and_configuration() {
95        let config = WSLUserConfiguration(3); // Assuming 3 = CustomKernel | CustomKernelCommandLine
96        let flags: WSLUserConfigurationFlags = config.into();
97        assert!(flags.contains(WSLUserConfigurationFlags::CustomKernel));
98        assert!(flags.contains(WSLUserConfigurationFlags::CustomKernelCommandLine));
99
100        let back_to_config: WSLUserConfiguration = flags.into();
101        assert_eq!(back_to_config, WSLUserConfiguration(3));
102    }
103}