git.lucas.co / cce-data-editor
structured data editor
git clone https://git.lucas.co/cce-data-editor.git

commitb59b83cb0c75cbf3d766052b48362f0dce2bde02
parenta20fd84408
authorLucas Galante <[email protected]>
date2026-07-01 12:04
Support nested KDL node block span lookup in main.rs

 src/main.rs | 32 ++++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 35a0ae1..ece4db4 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -79,15 +79,31 @@ fn find_kdl_span_in_doc(doc: &kdl::KdlDocument, tokens: &[PathToken]) -> Option<
 
             let nodes: Vec<&kdl::KdlNode> = doc.nodes().iter().filter(|n| n.name().value() == target_key).collect();
             if let Some(idx) = target_idx {
-                let node = nodes.get(idx)?;
-                if tokens.len() == 2 {
-                    let span = node.span();
-                    return Some((span.offset(), span.offset() + span.len()));
+                let node = nodes.first()?;
+                if let Some(children) = node.children() {
+                    let child_node = children.nodes().get(idx)?;
+                    if tokens.len() == 2 {
+                        let span = child_node.span();
+                        return Some((span.offset(), span.offset() + span.len()));
+                    } else if tokens.len() == 3 {
+                        if let PathToken::Key(prop_key) = &tokens[2] {
+                            if let Some(entry) = child_node.entries().iter().find(|e| e.name().map(|id| id.value()) == Some(prop_key)) {
+                                let span = entry.span();
+                                return Some((span.offset(), span.offset() + span.len()));
+                            }
+                        }
+                    }
                 } else {
-                    if let PathToken::Key(prop_key) = &tokens[2] {
-                        if let Some(entry) = node.entries().iter().find(|e| e.name().map(|id| id.value()) == Some(prop_key)) {
-                            let span = entry.span();
-                            return Some((span.offset(), span.offset() + span.len()));
+                    let node = nodes.get(idx)?;
+                    if tokens.len() == 2 {
+                        let span = node.span();
+                        return Some((span.offset(), span.offset() + span.len()));
+                    } else {
+                        if let PathToken::Key(prop_key) = &tokens[2] {
+                            if let Some(entry) = node.entries().iter().find(|e| e.name().map(|id| id.value()) == Some(prop_key)) {
+                                let span = entry.span();
+                                return Some((span.offset(), span.offset() + span.len()));
+                            }
                         }
                     }
                 }