use crate::schema::{CompiledSchema, MutationOperation};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SourceKind {
Relation,
Function,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SourceProbe {
pub schema: Option<String>,
pub name: String,
pub kind: SourceKind,
}
impl SourceProbe {
#[must_use]
pub fn display_name(&self) -> String {
match &self.schema {
Some(s) => format!("{s}.{}", self.name),
None => self.name.clone(),
}
}
}
fn split_source(sql_source: &str) -> (Option<String>, String) {
match sql_source.split_once('.') {
Some((schema, name)) => (Some(schema.to_string()), name.to_string()),
None => (None, sql_source.to_string()),
}
}
const fn mutation_source(mutation: &crate::schema::MutationDefinition) -> Option<&str> {
if let Some(src) = &mutation.sql_source {
return Some(src.as_str());
}
match &mutation.operation {
MutationOperation::Insert { table }
| MutationOperation::Update { table }
| MutationOperation::Delete { table }
if !table.is_empty() =>
{
Some(table.as_str())
},
_ => None,
}
}
#[must_use]
pub fn sql_source_probes(schema: &CompiledSchema) -> Vec<SourceProbe> {
let mut probes = Vec::with_capacity(schema.queries.len() + schema.mutations.len());
for query in &schema.queries {
if let Some(source) = &query.sql_source {
let (schema_part, name) = split_source(source);
probes.push(SourceProbe {
schema: schema_part,
name,
kind: SourceKind::Relation,
});
}
}
for mutation in &schema.mutations {
if let Some(source) = mutation_source(mutation) {
let (schema_part, name) = split_source(source);
probes.push(SourceProbe {
schema: schema_part,
name,
kind: SourceKind::Function,
});
}
}
probes
}
#[cfg(test)]
#[path = "source_probe_tests.rs"]
mod source_probe_tests;