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}