reifydb-rql 0.4.12

ReifyDB Query Language (RQL) parser and AST
Documentation
// SPDX-License-Identifier: Apache-2.0
// Copyright (c) 2025 ReifyDB

use std::collections::BTreeMap;

use crate::{
	Result,
	bump::Bump,
	token::{
		token::{Token, TokenKind},
		tokenize,
	},
};

pub fn explain_tokenize(query: &str) -> Result<String> {
	let bump = Bump::new();
	let tokens = tokenize(&bump, query)?;

	let mut lines: BTreeMap<u32, Vec<(usize, &Token)>> = BTreeMap::new();
	for (i, token) in tokens.iter().enumerate() {
		lines.entry(token.fragment.line().0).or_default().push((i, token));
	}

	let mut result = String::new();

	for (line, tokens) in lines {
		result.push_str(&format!("Line {}:\n", line));
		for (i, token) in tokens {
			let label = match &token.kind {
				TokenKind::EOF => "EOF".to_string(),
				TokenKind::Identifier => format!("Identifier(\"{}\")", token.value()),
				TokenKind::Keyword(kw) => {
					format!("Keyword({:?})", kw)
				}
				TokenKind::Literal(lit) => {
					format!("Literal({:?})", lit)
				}
				TokenKind::Operator(op) => {
					format!("Operator({:?})", op)
				}
				TokenKind::Variable => {
					format!("Variable({:?})", token.value())
				}
				TokenKind::Separator(sep) => {
					format!("Separator({:?})", sep)
				}
				TokenKind::SystemColumn => {
					format!("SystemColumn(\"{}\")", token.value())
				}
			};

			result.push_str(&format!("  [{:>3}] {}\n", i, label));
		}
		result.push('\n');
	}

	Ok(result)
}