emmylua_code_analysis/vfs/
file_id.rs1use 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 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 let json_invalid = "[42]";
97 let result: Result<FileId, _> = serde_json::from_str(json_invalid);
98 assert!(result.is_err());
99 }
100}