1use kiutils_sexpr::{Atom, Node, Span as CstSpan};
2use serde_json::Value;
3
4#[derive(Debug, Clone, PartialEq, Eq)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub struct UnknownNode {
7 pub head: Option<String>,
8 pub span: CstSpan,
9 pub node: Node,
10}
11
12impl UnknownNode {
13 pub fn from_node(node: &Node) -> Option<Self> {
14 match node {
15 Node::List { items, span } => {
16 let head = items.first().and_then(|n| match n {
17 Node::Atom {
18 atom: Atom::Symbol(s),
19 ..
20 } => Some(s.clone()),
21 _ => None,
22 });
23 Some(Self {
24 head,
25 span: *span,
26 node: node.clone(),
27 })
28 }
29 Node::Atom { span, .. } => Some(Self {
30 head: None,
31 span: *span,
32 node: node.clone(),
33 }),
34 }
35 }
36}
37
38#[derive(Debug, Clone, PartialEq)]
39#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
40pub struct UnknownField {
41 pub key: String,
42 pub value: Value,
43}