use super::super::types::SwrlArgument;
use anyhow::Result;
pub(crate) fn extract_numeric_value(arg: &SwrlArgument) -> Result<f64> {
match arg {
SwrlArgument::Literal(value) => value
.parse::<f64>()
.map_err(|_| anyhow::anyhow!("Cannot parse '{}' as numeric value", value)),
_ => Err(anyhow::anyhow!(
"Expected literal numeric value, got {:?}",
arg
)),
}
}
pub(crate) fn extract_string_value(arg: &SwrlArgument) -> Result<String> {
match arg {
SwrlArgument::Literal(value) => Ok(value.clone()),
SwrlArgument::Individual(value) => Ok(value.clone()),
SwrlArgument::Variable(name) => Err(anyhow::anyhow!("Unbound variable: {}", name)),
}
}
pub(crate) fn extract_list_items(arg: &SwrlArgument) -> Result<Vec<String>> {
match arg {
SwrlArgument::Literal(value) => Ok(value.split(',').map(|s| s.to_string()).collect()),
SwrlArgument::Individual(iri) => Err(anyhow::anyhow!(
"SWRL list built-in received RDF list resource '{iri}': genuine rdf:List \
(rdf:first/rdf:rest) traversal is not supported in this literal-list context; \
supply a comma-encoded literal instead"
)),
SwrlArgument::Variable(name) => Err(anyhow::anyhow!("Unbound variable: {}", name)),
}
}
pub(crate) fn extract_boolean_value(arg: &SwrlArgument) -> Result<bool> {
match arg {
SwrlArgument::Literal(value) => match value.to_lowercase().as_str() {
"true" | "1" => Ok(true),
"false" | "0" => Ok(false),
_ => Err(anyhow::anyhow!("Cannot parse '{}' as boolean value", value)),
},
_ => Err(anyhow::anyhow!(
"Expected literal boolean value, got {:?}",
arg
)),
}
}