tracker-rs 0.8.0

Rust bindings for tracker
Documentation
use crate::Batch;
use crate::SparqlStatement;
use glib::{prelude::*, translate::*};

#[derive(Debug)]
#[non_exhaustive]
pub enum StatementValue {
    String(String),
    Integer(i64),
    Double(f64),
    Boolean(bool),
    DateTime(glib::DateTime),
}

impl StatementValue {
    #[cfg(feature = "v3_5")]
    #[cfg_attr(docsrs, doc(cfg(feature = "v3_5")))]
    fn to_value(&self) -> glib::Value {
        use StatementValue::*;

        match self {
            String(v) => v.to_value(),
            Integer(v) => v.to_value(),
            Double(v) => v.to_value(),
            Boolean(v) => v.to_value(),
            DateTime(v) => v.to_value(),
        }
    }
}

pub trait BatchExtManual {
    #[cfg(feature = "v3_5")]
    #[cfg_attr(docsrs, doc(cfg(feature = "v3_5")))]
    #[doc(alias = "tracker_batch_add_statement")]
    fn add_statement(&self, stmt: &SparqlStatement, parameters: &[(&str, &StatementValue)]);
}

impl BatchExtManual for Batch {
    #[cfg(feature = "v3_5")]
    #[cfg_attr(docsrs, doc(cfg(feature = "v3_5")))]
    fn add_statement(&self, stmt: &SparqlStatement, parameters: &[(&str, &StatementValue)]) {
        let mut variable_names = vec![];
        let mut values = vec![];
        for t in parameters {
            variable_names.push(t.0);
            values.push(t.1.to_value());
        }

        unsafe {
            ffi::tracker_batch_add_statementv(
                self.to_glib_none().0,
                stmt.to_glib_none().0,
                parameters.len() as u32,
                variable_names.as_slice().to_glib_none().0,
                ToGlibContainerFromSlice::to_glib_none_from_slice(&values).0,
            );
        }
    }
}