cartulary 0.3.0-alpha.1

The knowledge layer of your project — decisions, issues, docs, all in one place.
Documentation
use crate::domain::model::query::QuerySchema;

use super::runner::QueryRunner;

/// Return the schema exposed by the workspace's query engine.
pub fn query_schema(runner: &dyn QueryRunner) -> anyhow::Result<QuerySchema> {
    runner.schema()
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::domain::model::query::{QueryRelation, QueryResult, QueryScript};

    struct StubRunner {
        schema: QuerySchema,
    }

    impl QueryRunner for StubRunner {
        fn run(&self, _: &QueryScript) -> anyhow::Result<QueryResult> {
            unreachable!("schema test should not run scripts")
        }

        fn schema(&self) -> anyhow::Result<QuerySchema> {
            Ok(self.schema.clone())
        }
    }

    #[test]
    fn query_schema_returns_what_the_runner_exposes() {
        let runner = StubRunner {
            schema: QuerySchema::new(vec![QueryRelation {
                name: "issue".to_owned(),
                columns: Vec::new(),
            }]),
        };
        let s = query_schema(&runner).unwrap();
        assert_eq!(s.relations.len(), 1);
        assert_eq!(s.relations[0].name, "issue");
    }
}