emmylua_code_analysis/vfs/
file_id.rs

1use std::cmp;
2
3use serde::{Deserialize, Deserializer, Serialize, Serializer};
4
5#[derive(Eq, PartialEq, Hash, Debug, Clone, Copy, PartialOrd)]
6pub struct FileId {
7    pub id: u32,
8}
9
10impl Serialize for FileId {
11    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
12    where
13        S: Serializer,
14    {
15        serializer.serialize_u32(self.id)
16    }
17}
18
19impl<'de> Deserialize<'de> for FileId {
20    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
21    where
22        D: Deserializer<'de>,
23    {
24        let id = u32::deserialize(deserializer)?;
25        Ok(FileId { id })
26    }
27}
28
29impl FileId {
30    pub fn new(id: u32) -> Self {
31        FileId { id }
32    }
33
34    pub const VIRTUAL: FileId = FileId { id: u32::MAX };
35}
36
37impl From<u32> for FileId {
38    fn from(id: u32) -> Self {
39        FileId { id }
40    }
41}
42
43impl cmp::Ord for FileId {
44    fn cmp(&self, other: &Self) -> cmp::Ordering {
45        self.id.cmp(&other.id)
46    }
47}
48
49#[derive(Debug, Clone, Hash, PartialEq, Eq)]
50pub struct InFiled<N> {
51    pub file_id: FileId,
52    pub value: N,
53}
54
55impl<N> InFiled<N> {
56    pub fn new(file_id: FileId, value: N) -> Self {
57        InFiled { file_id, value }
58    }
59}
60
61#[cfg(test)]
62mod tests {
63    use super::*;
64    use serde_json;
65
66    #[test]
67    fn test_file_id_serialization() {
68        let file_id = FileId { id: 42 };
69        let serialized = serde_json::to_string(&file_id).unwrap();
70        // u32 is serialized as a number, so the JSON representation is "42"
71        assert_eq!(serialized, "42");
72        let deserialized: FileId = serde_json::from_str(&serialized).unwrap();
73        assert_eq!(deserialized, file_id);
74    }
75
76    #[test]
77    fn test_file_id_new_and_virtual() {
78        let new_file_id = FileId::new(0);
79        assert_eq!(new_file_id.id, 0);
80
81        let virtual_id = FileId::VIRTUAL;
82        assert_eq!(virtual_id.id, u32::MAX);
83    }
84
85    #[test]
86    fn test_infiled_new() {
87        let file_id = FileId { id: 10 };
88        let infiled = InFiled::new(file_id, "test_value");
89        assert_eq!(infiled.file_id, file_id);
90        assert_eq!(infiled.value, "test_value");
91    }
92
93    #[test]
94    fn test_file_id_deserialization_error() {
95        // Provide an invalid JSON value for FileId to trigger an error.
96        let json_invalid = "[42]";
97        let result: Result<FileId, _> = serde_json::from_str(json_invalid);
98        assert!(result.is_err());
99    }
100}