use serde::ser::{Serialize, SerializeMap, SerializeSeq, Serializer}; use std::fmt; use crate::{ api::{Language, SyntaxNode, SyntaxToken}, NodeOrToken, }; struct SerDisplay(T); impl Serialize for SerDisplay { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.collect_str(&self.0) } } struct DisplayDebug(T); impl fmt::Display for DisplayDebug { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Debug::fmt(&self.0, f) } } impl Serialize for SyntaxNode { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let mut state = serializer.serialize_map(Some(3))?; state.serialize_entry("kind", &SerDisplay(DisplayDebug(self.kind())))?; state.serialize_entry("text_range", &self.text_range())?; state.serialize_entry("children", &Children(self))?; state.end() } } impl Serialize for SyntaxToken { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let mut state = serializer.serialize_map(Some(3))?; state.serialize_entry("kind", &SerDisplay(DisplayDebug(self.kind())))?; state.serialize_entry("text_range", &self.text_range())?; state.serialize_entry("text", &self.text())?; state.end() } } struct Children(T); impl Serialize for Children<&'_ SyntaxNode> { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let mut state = serializer.serialize_seq(None)?; self.0.children_with_tokens().try_for_each(|element| match element { NodeOrToken::Node(it) => state.serialize_element(&it), NodeOrToken::Token(it) => state.serialize_element(&it), })?; state.end() } }