use super::TpfQueryParams;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct TpfQuery {
pub subject: Option<String>,
pub predicate: Option<String>,
pub object: Option<String>,
}
impl TpfQuery {
pub fn is_unbound(&self) -> bool {
self.subject.is_none() && self.predicate.is_none() && self.object.is_none()
}
pub fn count_bound(&self) -> usize {
self.subject.iter().count() + self.predicate.iter().count() + self.object.iter().count()
}
}
pub fn parse_tpf_query(params: &TpfQueryParams) -> Result<TpfQuery, String> {
let q = TpfQuery {
subject: params.subject.clone().filter(|s| !s.is_empty()),
predicate: params.predicate.clone().filter(|s| !s.is_empty()),
object: params.object.clone().filter(|s| !s.is_empty()),
};
if let Some(s) = &q.subject {
if !s.starts_with("http://") && !s.starts_with("https://") && !s.starts_with("_:") {
return Err(format!("invalid subject IRI: {}", s));
}
}
if let Some(p) = &q.predicate {
if !p.starts_with("http://") && !p.starts_with("https://") {
return Err(format!("invalid predicate IRI: {}", p));
}
}
Ok(q)
}