use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct Config {
#[serde(default)]
pub command: Option<String>,
#[serde(flatten)]
pub languages: HashMap<String, LanguageConfig>,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct LanguageConfig {
pub parser: Option<String>,
#[serde(default)]
pub queries: HashMap<String, QueryConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum QueryConfig {
TreeSitter(String),
Structured {
#[serde(default)]
format: QueryFormat,
query: String,
#[serde(default)]
strip: Option<String>,
#[serde(default)]
template: Option<String>,
},
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum QueryFormat {
#[default]
TreeSitter,
Jq,
}
impl QueryConfig {
pub fn format(&self) -> QueryFormat {
match self {
QueryConfig::TreeSitter(_) => QueryFormat::TreeSitter,
QueryConfig::Structured { format, .. } => format.clone(),
}
}
pub fn query_str(&self) -> &str {
match self {
QueryConfig::TreeSitter(s) => s.as_str(),
QueryConfig::Structured { query, .. } => query.as_str(),
}
}
pub fn strip(&self) -> Option<&str> {
match self {
QueryConfig::TreeSitter(_) => None,
QueryConfig::Structured { strip, .. } => strip.as_deref(),
}
}
pub fn template(&self) -> Option<&str> {
match self {
QueryConfig::TreeSitter(_) => None,
QueryConfig::Structured { template, .. } => template.as_deref(),
}
}
}