pub mod items;
pub mod site;
use std::sync::Arc;
use eure_schema::SchemaDocument;
use query_flow::{Db, QueryError};
pub use items::{CompletionItem, CompletionKind, completion_items};
pub use site::{Anchor, AnchorKind, CompletionSite, SiteKind, ValueStyle, find_site};
use super::assets::TextFile;
use super::parse::ParseCst;
use super::schema::{DocumentToSchemaQuery, ResolveSchema};
pub fn get_completions(
db: &impl Db,
file: &TextFile,
offset: u32,
) -> Result<Vec<CompletionItem>, QueryError> {
let parsed = db.query(ParseCst::new(file.clone()))?;
let source = db.asset(file.clone())?;
let Some(site) = find_site(source.get(), &parsed.cst, offset) else {
return Ok(Vec::new());
};
let schema = load_schema(db, file)?;
Ok(completion_items(&site, schema.as_deref()))
}
pub(super) fn load_schema(
db: &impl Db,
file: &TextFile,
) -> Result<Option<Arc<SchemaDocument>>, QueryError> {
let resolved = match db.query(ResolveSchema::new(file.clone())) {
Ok(resolved) => resolved.as_ref().clone(),
Err(QueryError::UserError(_)) => return Ok(None),
Err(error) => return Err(error),
};
let Some(resolved) = resolved else {
return Ok(None);
};
match db.query(DocumentToSchemaQuery::new(resolved.file)) {
Ok(validated) => Ok(Some(validated.schema.clone())),
Err(QueryError::UserError(_)) => Ok(None),
Err(error) => Err(error),
}
}