use super::super::super::command::{JqQueryOptions, QueryKind, QueryOptions};
use super::super::{DispatchResult, GlobalOptions, load_or_create_snapshot};
pub fn handle_query_command(opts: &QueryOptions, global: &GlobalOptions) -> DispatchResult {
use crate::query::{query_component_of, query_where_symbol, query_who_imports};
use std::path::Path;
let root = Path::new(".");
let snapshot = match load_or_create_snapshot(root, global) {
Ok(s) => s,
Err(e) => {
eprintln!("[loct][error] {}", e);
return DispatchResult::Exit(1);
}
};
let result = match opts.kind {
QueryKind::WhoImports => query_who_imports(&snapshot, &opts.target),
QueryKind::WhereSymbol => query_where_symbol(&snapshot, &opts.target),
QueryKind::ComponentOf => query_component_of(&snapshot, &opts.target),
};
if global.json {
match serde_json::to_string_pretty(&result) {
Ok(json) => println!("{}", json),
Err(e) => {
eprintln!("[loct][error] Failed to serialize results: {}", e);
return DispatchResult::Exit(1);
}
}
} else {
println!("{} '{}':", result.kind, result.target);
if result.results.is_empty() {
println!(" (no results)");
} else {
for m in &result.results {
if let Some(line) = m.line {
print!(" {}:{}", m.file, line);
} else {
print!(" {}", m.file);
}
if let Some(ref ctx) = m.context {
print!(" - {}", ctx);
}
println!();
}
}
}
DispatchResult::Exit(0)
}
pub fn handle_jq_query_command(opts: &JqQueryOptions, global: &GlobalOptions) -> DispatchResult {
use crate::jaq_query::{JaqExecutor, format_output};
use std::path::Path;
let snapshot = if let Some(ref explicit_path) = opts.snapshot_path {
use crate::snapshot::Snapshot;
let snapshot_path = match Snapshot::find_latest_snapshot(Some(explicit_path.as_ref())) {
Ok(p) => p,
Err(e) => {
eprintln!("[loct][error] {}", e);
eprintln!("[loct][hint] Specified snapshot path not found.");
return DispatchResult::Exit(1);
}
};
match std::fs::read_to_string(&snapshot_path)
.map_err(std::io::Error::other)
.and_then(|content| {
serde_json::from_str::<crate::snapshot::Snapshot>(&content)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
}) {
Ok(s) => s,
Err(e) => {
eprintln!("[loct][error] Failed to load snapshot: {}", e);
return DispatchResult::Exit(1);
}
}
} else {
match load_or_create_snapshot(Path::new("."), global) {
Ok(s) => s,
Err(e) => {
eprintln!("[loct][error] {}", e);
return DispatchResult::Exit(1);
}
}
};
let snapshot_json = match serde_json::to_value(&snapshot) {
Ok(v) => v,
Err(e) => {
eprintln!("[loct][error] Failed to serialize snapshot: {}", e);
return DispatchResult::Exit(1);
}
};
let executor = JaqExecutor::new();
let results = match executor.execute(
&opts.filter,
&snapshot_json,
&opts.string_args,
&opts.json_args,
) {
Ok(r) => r,
Err(e) => {
eprintln!("[loct][error] Filter execution failed: {}", e);
return DispatchResult::Exit(1);
}
};
for result in &results {
let output = format_output(result, opts.raw_output, opts.compact_output);
println!("{}", output);
}
if opts.exit_status {
if results.is_empty() {
return DispatchResult::Exit(1);
}
let all_false_or_null = results
.iter()
.all(|v| v.is_null() || (v.as_bool().is_some() && !v.as_bool().unwrap()));
if all_false_or_null {
return DispatchResult::Exit(1);
}
}
DispatchResult::Exit(0)
}