|
3 | 3 | //! The files in this directory can be used to tune and monitor miscellaneous |
4 | 4 | //! and general things in the operation of the Linux kernel. |
5 | 5 |
|
6 | | -use std::cmp; |
7 | 6 | use std::collections::HashSet; |
8 | 7 | use std::str::FromStr; |
| 8 | +use std::{cmp, fmt::Display}; |
9 | 9 |
|
10 | 10 | #[cfg(feature = "serde1")] |
11 | | -use serde::{Deserialize, Serialize}; |
| 11 | +use serde_with::{DeserializeFromStr, SerializeDisplay}; |
12 | 12 |
|
13 | 13 | use bitflags::bitflags; |
14 | 14 |
|
15 | 15 | use crate::{ProcError, ProcResult}; |
16 | 16 |
|
17 | 17 | /// Represents a kernel version, in major.minor.release version. |
18 | 18 | #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Default)] |
19 | | -#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] |
| 19 | +#[cfg_attr(feature = "serde1", derive(SerializeDisplay, DeserializeFromStr))] |
20 | 20 | pub struct Version { |
21 | 21 | pub major: u8, |
22 | 22 | pub minor: u8, |
@@ -103,6 +103,12 @@ impl cmp::PartialOrd for Version { |
103 | 103 | } |
104 | 104 | } |
105 | 105 |
|
| 106 | +impl Display for Version { |
| 107 | + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
| 108 | + write!(f, "{}.{}.{}", self.major, self.minor, self.patch) |
| 109 | + } |
| 110 | +} |
| 111 | + |
106 | 112 | /// Represents a kernel type |
107 | 113 | #[derive(Debug, Clone, Eq, PartialEq)] |
108 | 114 | pub struct Type { |
@@ -429,4 +435,33 @@ mod tests { |
429 | 435 | let a = SemaphoreLimits::from_str("1 string 500 3200"); |
430 | 436 | assert!(a.is_err() && a.err().unwrap() == "Failed to parse SEMMNS"); |
431 | 437 | } |
| 438 | + |
| 439 | + #[cfg(feature = "serde1")] |
| 440 | + mod serde_kernel_version { |
| 441 | + #[test] |
| 442 | + fn should_serialize_kernel_version() { |
| 443 | + let version = Version { |
| 444 | + major: 42, |
| 445 | + minor: 0, |
| 446 | + patch: 1, |
| 447 | + }; |
| 448 | + let version = serde_json::to_string(&version).unwrap(); |
| 449 | + |
| 450 | + // NOTE: The double quote is necessary because of the JSON format. |
| 451 | + assert_eq!(r#""42.0.1""#, &version); |
| 452 | + } |
| 453 | + |
| 454 | + #[test] |
| 455 | + fn should_deserialize_kernel_version() { |
| 456 | + let expected = Version { |
| 457 | + major: 21, |
| 458 | + minor: 0, |
| 459 | + patch: 2, |
| 460 | + }; |
| 461 | + // NOTE: The double quote is necessary because of the JSON format. |
| 462 | + let version: Version = serde_json::from_str(r#""21.0.2""#).unwrap(); |
| 463 | + |
| 464 | + assert_eq!(version, expected); |
| 465 | + } |
| 466 | + } |
432 | 467 | } |
0 commit comments