leetgo_rs/
list.rs

1use serde::{Deserialize, Deserializer, Serialize, Serializer};
2use serde::de::Visitor;
3use serde::ser::SerializeSeq;
4
5type ListLink = Option<Box<ListNode>>;
6
7#[derive(Debug, PartialEq, Eq, Clone)]
8pub struct ListNode {
9    pub val: i32,
10    pub next: ListLink,
11}
12
13impl ListNode {
14  #[inline]
15  fn new(val: i32) -> Self {
16    ListNode {
17      next: None,
18      val
19    }
20  }
21}
22
23#[macro_export]
24macro_rules! list {
25    () => {
26        None
27    };
28    ($e:expr) => {
29        Some(Box::new(ListNode::new($e)))
30    };
31    ($e:expr, $($tail:tt)*) => {
32        Some(Box::new(ListNode {
33            val: $e,
34            next: list!($($tail)*),
35        }))
36    };
37}
38
39#[derive(Debug, PartialEq, Eq, Clone)]
40pub struct LinkedList(ListLink);
41
42impl From<LinkedList> for ListLink {
43    fn from(list: LinkedList) -> Self {
44        list.0
45    }
46}
47
48impl From<ListLink> for LinkedList {
49    fn from(link: Option<Box<ListNode>>) -> Self {
50        LinkedList(link)
51    }
52}
53
54impl Serialize for LinkedList {
55    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
56        where
57            S: Serializer,
58    {
59        let mut seq = serializer.serialize_seq(None)?;
60        let mut current = &self.0;
61        while let Some(ref node) = current {
62            seq.serialize_element(&node.val)?;
63            current = &node.next;
64        }
65        seq.end()
66    }
67}
68
69struct LinkedListVisitor;
70
71impl<'de> Visitor<'de> for LinkedListVisitor {
72    type Value = LinkedList;
73
74    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
75        formatter.write_str("a list of integers")
76    }
77
78    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
79        where
80            A: serde::de::SeqAccess<'de>,
81    {
82        let mut head = None;
83        let mut current = &mut head;
84        while let Some(val) = seq.next_element()? {
85            let node = ListNode { val, next: None };
86            *current = Some(Box::new(node));
87            current = &mut current.as_mut().unwrap().next;
88        }
89        Ok(LinkedList(head))
90    }
91}
92
93impl<'de> Deserialize<'de> for LinkedList {
94    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
95        where
96            D: Deserializer<'de>,
97    {
98        deserializer.deserialize_seq(LinkedListVisitor)
99    }
100}
101
102#[cfg(test)]
103mod tests {
104    use super::*;
105
106    #[test]
107    fn test_list_serialize() {
108        let list = LinkedList(list!(1, 2, 3));
109        let serialized = serde_json::to_string(&list).unwrap();
110        assert_eq!(serialized, "[1,2,3]");
111    }
112
113    #[test]
114    fn test_list_deserialize() {
115        let serialized = "[1,2,3]";
116        let list: LinkedList = serde_json::from_str(serialized).unwrap();
117        assert_eq!(list, LinkedList(list![1, 2, 3]));
118
119        let serialized = "[]";
120        let list: LinkedList = serde_json::from_str(serialized).unwrap();
121        assert!(list.0.is_none());
122
123        let serialized = "[true]";
124        let list = serde_json::from_str::<LinkedList>(serialized);
125        assert!(list.is_err());
126    }
127}