use super::sources::{FileId, Source, SourceType};
use std::sync::Arc;
#[salsa::query_group(InputStorage)]
pub(crate) trait InputDatabase {
#[salsa::input]
fn input(&self, file_id: FileId) -> Source;
#[salsa::input]
fn schema_input(&self) -> Option<Arc<crate::Schema>>;
#[salsa::invoke(source_code)]
fn source_code(&self, file_id: FileId) -> Arc<String>;
#[salsa::invoke(source_type)]
fn source_type(&self, file_id: FileId) -> SourceType;
#[salsa::input]
fn source_files(&self) -> Vec<FileId>;
#[salsa::invoke(type_definition_files)]
fn type_definition_files(&self) -> Vec<FileId>;
#[salsa::invoke(executable_definition_files)]
fn executable_definition_files(&self) -> Vec<FileId>;
}
fn source_code(db: &dyn InputDatabase, file_id: FileId) -> Arc<String> {
db.input(file_id).text().clone()
}
fn source_type(db: &dyn InputDatabase, file_id: FileId) -> SourceType {
db.input(file_id).source_type()
}
fn type_definition_files(db: &dyn InputDatabase) -> Vec<FileId> {
db.source_files()
.into_iter()
.filter(|source| {
matches!(
db.source_type(*source),
SourceType::Schema | SourceType::Document
)
})
.collect()
}
fn executable_definition_files(db: &dyn InputDatabase) -> Vec<FileId> {
db.source_files()
.into_iter()
.filter(|source| {
matches!(
db.source_type(*source),
SourceType::Executable | SourceType::Document
)
})
.collect()
}