use serde_json::Value;
use vantage_core::{Result, error};
pub(crate) fn validate(kind: &'static str, name: &str) -> Result<()> {
let mut chars = name.chars();
let valid = chars
.next()
.is_some_and(|c| c == '_' || c.is_ascii_alphabetic())
&& chars.all(|c| c == '_' || c.is_ascii_alphanumeric());
if valid {
Ok(())
} else {
Err(error!(
"GraphQL name is not valid",
kind = kind,
name = name
))
}
}
pub(crate) fn validate_path(kind: &'static str, path: &str) -> Result<()> {
if path
.split('.')
.all(|segment| validate(kind, segment).is_ok())
{
Ok(())
} else {
Err(error!(
"GraphQL name is not valid",
kind = kind,
name = path
))
}
}
pub(crate) fn validate_object_keys(kind: &'static str, value: &Value) -> Result<()> {
match value {
Value::Object(map) => {
for (key, inner) in map {
validate(kind, key)?;
validate_object_keys(kind, inner)?;
}
Ok(())
}
Value::Array(items) => items
.iter()
.try_for_each(|item| validate_object_keys(kind, item)),
_ => Ok(()),
}
}
pub(crate) fn validate_root_args(args: &Value) -> Result<()> {
if let Value::Object(map) = args {
for (name, value) in map {
validate("root argument", name)?;
validate_object_keys("root argument key", value)?;
}
}
Ok(())
}